可以像这样获得未经评估的符号的值:
(let ((form '(+ 1 2))) `',form)
此表达式的计算结果如下:
'(+ 1 2)
有没有办法做同样的事情却没有使用反引号?
答案 0 :(得分:1)
(let ((form '(+ 1 2))) (list 'quote form))
如果form
真的是一个常数:
(list 'quote (list '+ '1 '2))
1
和2
上的引号是多余的,因为它们是文字,但它们是提供信息的,并且已经存在,以防您用实际表达式替换它。
答案 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无法从符号到词法绑定的值。在源代码中,符号表示变量,但在运行时我们有词法绑定,而不是从符号到值的关联。