Common Lisp反引用评估:分隔符和运算符

时间:2012-07-22 14:45:47

标签: common-lisp interpretation

怎么样,在

`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4)

减号(“ - ”)不被视为操作符(但作为符号;' - 而不是#' - - 正确吗?)(这部分我想我明白了。)

但是为什么第三个左括号确实被评估为'( - > (list ...(也就是说,列表/表达式分隔符,而不仅仅是像' - 上面那样的文字?)解释器是否“向前查看”结束分隔符,还是只是说“好吧,这个应该是一个列表。如果右边没有分隔符,表达式无效,这不是我的问题。“?

抱歉这个令人困惑的问题;把它煮沸,我想我的问题是:解释器如何逐步评估上面的列表? (也可以随意更正术语。)

2 个答案:

答案 0 :(得分:4)

`(1 ,(+ 1 1) (- 4 1) 4)

Backquote是一个读取宏。它在READ TIME转换表达式。

这样做:

 (read-from-string "`(1 ,(+ 1 1) (- 4 1) 4)")

这被视为特定于实现的表单。类似的东西:

 (list* 1 (+ 1 1) '((- 4 1) 4))

CL标准没有规定反引号解析的内容。

因此上述转换是由READER完成的。

然后使用通常的规则进行评估。没什么特别的。

LIST*获取第一个args并在最后一个arg之前将它们对齐,这是一个列表。

答案 1 :(得分:2)

我试图想象你在想什么导致了混乱。我问题是:

  

如果反引用引用的话,为什么括号仍然是指列表,而不仅仅是一段文字?

如果这就是你所要求的,那么答案(粗略地说 - 像rainer这样的人对lisp比我更了解)引用并不像你想象的那么简单。当lisp读取代码时,它由称为“读者”的东西处理。将代码转换为语法树 - 一组列表,形成包含程序的树。

引用只是向读者发出的说明如下:

  

将`(a,b)视为(列出'a b)

和逗号的工作方式类似于

  

忽略上述内容 - 做你通常做的事情

我不知道这是否有帮助。如果我与rainer相矛盾,那么他(我认为这是男性名字?)获胜。我只是想把更多的东西放在你的脑海里。

哦,还有一件事。引用不会使事情“文本”。它使单词原子(和括号列表)。所以它真的不像“制作这个文字”那么简单。