可以获得未经计算的符号的值,如:
(let ((form '(+ 1 2))) `',form)此表达式的计算结果如下:
'(+ 1 2)有什么方法可以做到同样的事情,但不使用反向报价?
发布于 2016-07-13 11:42:20
如果需要,可以使用更长的语法。让我们看一下您的表单是如何一步一步地读取和评估的。
(let ((form '(+ 1 2))) `',form)这里引用了撇号:
(let ((form '(+ 1 2))) `(quote ,form))回引/逗号(准引号)是生成数据的缩写:
(let ((form '(+ 1 2))) (list 'quote form))评估let绑定,它将form与其值(实际上是list (+ 1 2) )关联到该表达式的词法环境中:
(list 'quote form)上面的Te构建了一个由quote符号和绑定到form的当前值组成的列表。上面的结果是一个以引号开头的列表和一个子列表,该列表打印如下:
(quote (+ 1 2))..。它承认了这种更简单的表示:
'(+ 1 2)因此,如果您愿意,可以使用(list 'quote form),但这并没有太大的不同。
发布于 2016-07-13 11:36:14
(let ((form '(+ 1 2))) (list 'quote form))如果form确实是一个常量:
(list 'quote (list '+ '1 '2))1和2上的引号是多余的,因为它们是文字,但是它们是信息丰富的,并且已经在那里了,以防您用实际的表达式替换。
发布于 2016-07-13 19:09:31
(let ((form '(+ 1 2))) `',form)你问:
可以得到未评估的符号的值.
实际上,这并不是它所做的。默认情况下,Common具有使用词法绑定的局部变量,而不是具有值的符号。上面的form计算变量form的值,而不是符号form的值。form的值是list (+ 1 2)。使用引用的quote,您可以在它周围放置一个列表(quote ...)。它被打印为(QUOTE (+ 1 2))或'(+ 1 2)。
请注意,Common无法从符号获得词法绑定的值。在源代码符号中表示变量,但在运行时我们有词法绑定,而不是从符号到值的关联。
https://stackoverflow.com/questions/38350406
复制相似问题