Common lisp 获取符号的值而不计算它
可以按如下方式获得未计算的符号值:Common lisp 获取符号的值而不计算它,common-lisp,Common Lisp,可以按如下方式获得未计算的符号值: (let ((form '(+ 1 2))) `',form) 此表达式的计算结果如下: '(+ 1 2) 有没有办法做同样的事情,但不使用反向报价 (let ((form '(+ 1 2))) (list 'quote form)) 如果form实际上是一个常数: (list 'quote (list '+ '1 '2)) 1和2上的引号是多余的,因为它们是文字,但它们是信息性的,并且已经存在,以防您用实际表达式替换它们。如果需要,可以使用更长的语法
(let ((form '(+ 1 2))) `',form)
此表达式的计算结果如下:
'(+ 1 2)
有没有办法做同样的事情,但不使用反向报价
(let ((form '(+ 1 2))) (list 'quote form))
如果form
实际上是一个常数:
(list 'quote (list '+ '1 '2))
1
和2
上的引号是多余的,因为它们是文字,但它们是信息性的,并且已经存在,以防您用实际表达式替换它们。如果需要,可以使用更长的语法。让我们看看如何一步一步地阅读和评估您的表单
(let ((form '(+ 1 2))) `',form)
撇号是引语:
(let ((form '(+ 1 2))) `(quote ,form))
反引号/逗号(准引号)是建筑数据的缩写:
(let ((form '(+ 1 2))) (list 'quote form))
评估let
绑定,该绑定将表单
与其值关联,字面上是该表达式词法环境中的列表(+1 2)
:
(list 'quote form)
上面的Te构建了一个由引号
符号和绑定到表单
的当前值组成的列表。上面的结果是一个以引号和子列表开头的列表,其打印如下:
(quote (+ 1 2))
。。。这允许这种更简单的表述:
'(+ 1 2)
因此,如果您愿意,您可以使用(列表报价表)
,但这并没有太大区别
(let ((form '(+ 1 2))) `',form)
你问:
可以获得未计算的符号值
事实上这并不是它真正的功能。默认情况下,Common Lisp使用词法绑定而不是具有值的符号来生成局部变量。上面的form
计算变量form
的值,而不是符号form
的值。表单的值是列表(+1 2)
。使用后引号引号
,您可以在其周围放置一个列表(引号…
)。它被打印为(引号(+12))
或”(+12)
请注意,Common Lisp无法从符号获取词法绑定的值。在源代码中,符号表示变量,但在运行时,我们有词法绑定,而不是从符号到值的关联。正是我所寻找的。因此,任何反引号表达式都可以用list
、cons
和append
的组合来代替,对吗?是的,指定为等同于使用list
、append
、ncoc
和quote
,或任何等效表达式,如使用cons
,list*
等。(list'quote(+12))
令人困惑。这是什么意思。为什么第一个被引用,第二个没有被引用?@RainerJoswig当试图用它的值替换表单时,这应该是评估中间步骤的表示。我同意这是非常令人困惑的。谢谢