获得符号的价值而不进行评估

时间:2016-07-13 11:27:16

标签: common-lisp

可以像这样获得未经评估的符号的值:

(let ((form '(+ 1 2))) `',form)

此表达式的计算结果如下:

'(+ 1 2)

有没有办法做同样的事情却没有使用反引号?

3 个答案:

答案 0 :(得分:1)

(let ((form '(+ 1 2))) (list 'quote form))

如果form真的是一个常数:

(list 'quote (list '+ '1 '2))

12上的引号是多余的,因为它们是文字,但它们是提供信息的,并且已经存在,以防您用实际表达式替换它。

答案 1 :(得分:0)

如果需要,您可以使用更长的语法。让我们一步一步看看您的表单是如何被阅读和评估的。

(let ((form '(+ 1 2))) `',form)

撇号是引用:

(let ((form '(+ 1 2))) `(quote ,form))

反引号/逗号(quasiquote)是构建数据的简写:

(let ((form '(+ 1 2))) (list 'quote form))

评估let绑定,它将form与其值(字面意思为列表(+ 1 2))关联在此表达式的词汇环境中:

(list 'quote form)

上面的内容构建了一个由quote符号和绑定到form的当前值组成的列表。上面的结果是以quote和子列表开头的列表,其打印如下:

(quote (+ 1 2))

...承认这个更简单的表示:

'(+ 1 2)

如果您愿意,可以使用(list 'quote form),但这并没有太大区别。

答案 2 :(得分:0)

(let ((form '(+ 1 2))) `',form)

你问:

  

可以获得未评估的符号值...

实际上这不是它真正的作用。默认情况下,Common Lisp具有使用词法绑定的局部变量,而不是具有值的符号。高于form计算变量form的值,而不是符号form的值。 form的值是列表(+ 1 2)。使用反引号quote,您可以在其周围放置一个列表(quote ...)。其打印为(QUOTE (+ 1 2))'(+ 1 2)

请注意,Common Lisp无法从符号到词法绑定的值。在源代码中,符号表示变量,但在运行时我们有词法绑定,而不是从符号到值的关联。