0

能够quote多次使用有没有用?

Like 'ais different from ''aand (quote a)is different from(quote (quote a))

我的意思是,为什么不拥有它,这样它就''a等于'a或什至''''''''a. quote如果它给出的论点尚未被引用,则将引用,并且这种方式 ''''a将评估为'a.

我觉得它的方式不对,因为我认为问题应该是:它被引用了吗?而不是被引用了多少次?没有任何?一次?100次?

4

3 回答 3

2

嵌套引号在很大程度上是无用的。它可能发生在反引号语法的编译器的输出中,但我想不出你会这样做的任何理由,即使在嵌套宏中也是如此。如果您发现自己使用了级联引号,这可能意味着您在反引号模板中插入了错误的取消引用级别的表达式。

具体来说,假设你写了这样的东西:

````(,,,,'''''a)  ;; goal is to be left with ('a) at the end of four eval rounds

但是在这里,逗号和引号基本上取消了,你可以这样做:

````('a)

无需将表单分配给''''a最里面的反引号,并让它'a在多个评估中反向工作。只需分配'a到最外层即可。

另一个例子是对上述内容的轻微修改。我们预计会发生四轮评估,并在最后一轮a替换它在评估环境中的绑定:

````(,,,,''''a)  ;; only four quotes this time

所以现在,在上述反引号的结果的三个evals 之后,我们留下了(a),如果我们eval这样,它想调用 function a。但是,同样,我们可以实现同样的事情:

````(a)

和之前一模一样,三个evals产生(a)一个又一个想要跟注a

现在如果符号a不是字面上的a,而是计算出来的呢?说a是被替换为b

 (let ((a 'b))
   ````(,,,''',a))

替换必须发生在反引号的第一次求值中,在 , 里面let,所以b左边需要四个逗号,以便它连接到最外面的反引号。结果对象等价于

 ```(,,,'''a)

在这个例子中,我们不能只取消三个逗号和引号。但是,习惯的方式是让两者穿插:

 (let ((a 'b))
   ````(,',',',a)) ;; instead of ,,,''',a 

每一轮评估都会去掉一个报价,然后再加一个。第一个替换用 替换,ab然后用引号保护它。然后在下一轮中,该引号之前的逗号会,'b被替换为b,但之前的另一个引号会再次保护它,依此类推。

也就是说,您可能会看到直接复合引号做一些有用的两种情况是:三重(或更多)嵌套反引号(很少开始!)其中有人使用,,'',expr而不是,',',expr; 以及多余地使用多个引号来对抗某种形式的多次评估,这些评估不必要地被淹没在多个评估轮次中。

于 2013-04-30T19:52:41.003 回答
0

当然有。当表达式被多次评估时,您需要将表达式按原样通过多次评估。请记住,在编写宏时,表达式通常会被计算两次(一次在扩展期间,一次作为宏结果),在极少数情况下可能需要计算更多次。

于 2012-12-26T13:11:47.980 回答
0

@Kaz 对于通常的做法毫无疑问是正确的,但我同意 @JanHudec 关于什么适合 CL。 'a与 的意思相同(quote a),与''a的意思相同(quote (quote a))。你的建议,user1076329,是评估(quote (quote a))应该具有与评估相同的结果(quote a)。让函数难以返回,感觉有悖于CL的精神'a. (例如,假设您正在编写一个程序,该程序将生成 Lisp 源代码以写入文件并稍后进行评估?或者编写一个为编写 Lisp 程序的程序生成 Lisp 源代码的程序?Lisp 旨在使做这种事情很容易。)在许多情况下,您可以并且应该使用宏,但本质上,宏只是构造列表然后评估它们的方式。您应该能够在没有宏或反引号的情况下构建相同的列表,即使它们更容易。

于 2013-05-01T02:14:14.017 回答