2014-05-13 94 views
0

如果我有一个像这样的列表(define lst '((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4)))),我试着'评估'表达式(即作为结果'((1 (1 2)) (3 (3 4)))),我得到了和我一样的列表。在球拍列表里面的表达

我知道如果我使用(quoasiquote ((,(car '(1 2)) (1 2)) (,(car '(3 4)) (3 4)))我获得了我在找的东西,但是问题出现在迭代方法的执行中,我认为我不能只取值,没有一个列表。 (即只取quoasiquote表达式的第二部分)。

例如,如果我使用for/list,我做(list-ref lst 0),我获得'(,(car '(1 2)) (1 2)),当我想(,(car '(1 2)) (1 2))quoasiquote功能使用它。

如何获取列表中的表达式并对其进行评估?

谢谢。

+4

问题不明确。请写出你打算创建的'for/list'循环,指出你期待的结果和你当前获得的结果 –

+0

@ÓscarLópez我希望现在能更好地解释! –

回答

0

所以,当你报价数据t就像Perl中一些流行的Algol方言中的单引号。例如print '$_';实际上打印$ _而不是变量$ _所表示的值。如果您使用双引号,则字符串中的变量将扩展为其值。

在计划中我们有(quote x)这是'x。自从'引用它以来,没有任何内容会被评估。如果它是`x,与(quasiquote x)相同,则Scheme会查找,expression(与(unquote expression)相同)和,@expression(与(unquote-splicing expression)相同)。这些引用格式是而不是程序,但宏。它将您的静态代码转换为不同的静态代码。

所以(begin (define test 10) `((1 2) (3 ,(+ test 4)))) ; ==> ((1 2) (3 14))

什么计划确实是将其转化为(list '(1 2) (list 3 (+ test 4))),而如果它是`((3 ,(+ test 4)) (1 2))它变成(cons (list 3 (+ test 4)) '((1 2))),因为尾部可以是恒定的,但头部可如果它不需要有一个评价的尾巴。

我从你那里得到一个印象,你认为你可以存储文本,然后像(let ((x '((1 2) (3 ,(+ test 4))))) `x)一样展开它们,但这不起作用,因为quasiquote是一个宏,因此它将评估为x。和(let ((x '((1 2) (3 ,(+ test 4))))) `,x)将评估为((1 2) (3 ,(+ test 4)))

+0

我不得不说,你在这里写的所有内容都在Racket手册中,并且在发布问题之前阅读。在此之后,我不得不真诚地说,你的解释是非常好的。比手册好。而你是对的:)。我不能,所以我会去适应@uselpa的答案。谢谢你们两位。 –

0

我很自信,我们在这里有一个XY-problem因为你描述的是非常不寻常的。另外,我想在这里唯一的解决方案是使用eval,这再次表明您可能正在走向错误的方向。

但这里是什么我相信一点尝试你想:

(define lst '((list (car '(1 2)) '(1 2)) 
       (list (car '(3 4)) '(3 4)))) 

(define-namespace-anchor nsa) 
(define ns (namespace-anchor->namespace nsa)) 

(for/list ((i lst)) 
    (define e (eval i ns)) 
    (printf "evaluating ~a to ~a\n" i e) 
    e) 

,它将打印

evaluating (list (car '(1 2)) '(1 2)) to (1 (1 2)) 
evaluating (list (car '(3 4)) '(3 4)) to (3 (3 4)) 

和评价

'((1 (1 2)) (3 (3 4))) 
+0

如果我更改''''list',你的答案有效,它是一样的。但是'','不起作用,所以我要适应我的代码。谢谢。 –