2014-11-23 52 views
0

我正试图创建一个特殊的折叠函数。确定嵌套引号并在计划中取消引用

我有一个关于报价的问题,尤其是他们嵌套的。看起来他们有时候被列为名单的开头,有时候作为一个引用。

说我得到了下面的代码:

'(x '(a b c)) 

然后:

(car '(x '(a b c))) 

将返回:X。 While:

(cadr '(x '(a b c))) 

将返回:'(a b c)。 这是什么意思?这是一个列表吗?如果是这样,为什么:

(caadr '(x '(a b c))) 

返回:引用。这句话的意思是什么? 有什么办法来标识这些列表?如果是这样,是否有任何方法来引用它们?

回答

3

当我们评估引用的表达式时,请记住这个表达式:'x只是对此的简写:(quote x)。例如:

'(x '(a b c)) 

等同于:

(quote (x (quote (a b c)))) 

现在这个表达式也将返回一个带引号的表达,这恰好开始又一引述表达:

(cadr (quote (x (quote (a b c))))) 
       --------------- 
=> ''(a b c) 

这在下一个例子中更为明显,我们最终检索到'quote符号本身:

(caadr (quote (x (quote (a b c))))) 
        ----- 
=> 'quote 

对于这个问题的最后一部分:如果你想诠释最里面的列表作为列表,而不是作为一个引用表达式,则不要引用它在所有:

(cadr '(x (a b c))) 
=> '(a b c) 

当然,我们也可以离开第二quoteeval最里面的名单,但这是一个麻烦,potentially evil

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

(eval (cadr '(x '(a b c))) ns) 
=> '(a b c) 

或者我们可以使用quasiquoting and unquoting

(cadr `(x ,'(a b c))) 
=> '(a b c) 
+0

对,明白了。谢谢。 – StationaryTraveller 2014-11-23 14:22:18

+1

@StationaryTraveller太好了!请参阅我上次的编辑,了解一些额外的说明 – 2014-11-23 14:25:51