Clojure 方案中引用的符号

Clojure 方案中引用的符号,clojure,scheme,Clojure,Scheme,我不是方案专家,所以不确定我在这里使用的术语是否正确。让代码自己说话: CSI> (define tree '(1 2 3 'Symb 4 5 6)) #<unspecified> CSI> tree (1 2 3 (quote Symb) 4 5 6) CSI> (symbol? 'Symb) #t CSI> (map symbol? tree) (#f #f #f #f #f #f #f) (symbol?行上方的空白是用于(list?条件的,但可能是错

我不是方案专家,所以不确定我在这里使用的术语是否正确。让代码自己说话:

CSI> (define tree '(1 2 3 'Symb 4 5 6))
#<unspecified>
CSI> tree
(1 2 3 (quote Symb) 4 5 6)
CSI> (symbol? 'Symb)
#t
CSI> (map symbol? tree)
(#f #f #f #f #f #f #f)
(symbol?
行上方的空白是用于
(list?
条件的,但可能是错误的aproach


我使用的是鸡肉方案。

您遇到了口齿不清的引号“gotcha”。在Scheme中,符号用于变量引用,这一点您显然理解。计算结果如下:

> (symbol? 'Symb)
因为您引用了符号,并阻止它用作变量引用

> (symbol? Symb)
将首先查找Symb变量的值,然后检查该值是否为符号

> (let ((Symb 'foo)) (symbol? Symb))
将计算为#t,因为Symb的值是一个符号:foo

> (let ((Symb 7)) (symbol? Symb))
当然,会评估为#f

你似乎被引语的细微差别绊倒了

'Symb
实际上是速记;相当于

(quote Symbol)
它再次返回其未赋值的参数

但是您的代码不需要内部引用。当你

> (define tree '(1 2 3 'Symb 4 5 6))
整个清单都被引用了;列表中的任何内容都不会被评估。这就是为什么

> tree ; => (1 2 3 (quote Symb) 4 5 6)
在引用的列表中,“Symb相当于(quote Symb),它实际上是一个列表。由于整个列表都是带引号的,因此使用Symb UNQUOTE不会被视为变量引用。它只是一个象征

> (define tree '(1 2 3 Symb 4 5 6))
> tree ; => (1 2 3 Symb 4 5 6)
现在,如果您将所有这些参数传递给list函数,那么您最初所做的是正确的:

> (define tree (list 1 2 3 'Symb 4 5 6))
> tree ; => (1 2 3 Symb 4 5 6)
在这种情况下,您将这些参数传递给一个函数;函数的参数是经过计算的,所以您需要使用引号来防止符号被视为变量引用

> (define tree (list 1 2 3 (quote Symb) 4 5 6))
我也会这么做

> (define tree (list 1 2 3 (quote Symb) 4 5 6))