我对 racket 中的 '
符号的含义有些困惑。在我的理解中,同一符号具有不同的含义。看下面两个简单的例子:
返回一个新分配的列表,其中包含 vs 作为其元素。
> (list 1 2 3 4)
'(1 2 3 4)
该函数生成一个常量值,对应于数据(即程序片段的表示),但不包括其词法信息、源位置等。引用对、向量和框架是不可变的。
> '(1 2 3 4)
'(1 2 3 4)
所以我的问题是: 单引号符号
'
是否有两个含义(一个是符号,一个是列表),或者它们是相同的数据类型,list
实际上返回一个带引号的常量值?如果是第二种情况,为什么这样可以工作:> '(+ (- 2 13) 11)
'(+ (- 2 13) 11)
> (eval (list + (- 2 13) 11))
0
(还有(eval '(+ (- 2 13) 11))
可以正常工作并正确评估为0
)
但这个不行:
> (list + (- 2 13) 11)
'(#<procedure:+> -11 11)
> (eval '(#<procedure:+> -11 11))
. read: bad syntax `#<'
相关内容可能包括: Lisp / Scheme中的撇号是什么?
(eval '(#<procedure:+> -11 11))
无法工作的原因是#<procedure:+>
无法被读回。然而,使用 quasiquote 和 unquote,(eval (quasiquote ((unquote +) -11 11)))
可以工作。使用简写可以写成(eval `(,+ -11 11))
。 - Alex Knauth