如何访问引用列表中的变量

时间:2015-01-24 16:39:04

标签: common-lisp

我如何告诉Lisp我想将列表评估为“列表”,而不是“作为一个函数”?

(let ((x 500)) '(x . nil))

当我输入时,它会返回

(X)

好,它没有评估列表(我想要)。但它并没有将变量x替换为其值。

3 个答案:

答案 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既不是函数也不是变量,它只是符号。

希望这有帮助!