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))