我如何告诉Lisp我想将列表评估为“列表”,而不是“作为一个函数”?
(let ((x 500)) '(x . nil))
当我输入时,它会返回
(X)
好,它没有评估列表(我想要)。但它并没有将变量x替换为其值。
答案 0 :(得分:5)
'e
完全引用表达式e
,无法知道要评估哪些子表达式。如果使用反引号而不是引号,则可以使用逗号取消引用子表达式。
在您的示例中,您可以执行
(let ((x 500)) `(,x . nil))
,相当于'(500 . nil)
,因为x
未加引号。
答案 1 :(得分:4)
使用list
:
(let ((x 500))
(list x 3))
=> (500 3)
答案 2 :(得分:0)
仙人掌的答案很棒,但我会向你抛出一些额外的信息:)
在'(x.nil)中x不是变量,它是一个符号。符号用于命名。这种区别似乎很愚蠢,但可以真正帮助你对未来这些问题的直觉。
'变量'是符号和值之间的绑定。
因此,评估x基本上是说'给我一个由符号x'
命名的值函数和变量可以用相同的符号命名,因为它们位于不同的命名空间中,所以。
(defun x () "jam")
(defvar x 10)
(print x) ;; prints 10
(print (x)) ;; prints "jam"
这完全有效。在你的repl中尝试一下!
鉴于此,再看看
'(x . nil)
x既不是函数也不是变量,它只是符号。
希望这有帮助!