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当试图用它的值替换
表单时,这应该是评估中间步骤的表示。我同意这是非常令人困惑的。谢谢