2012-07-22 26 views
2

怎么回事,在Common Lisp的反引号评价:分隔符和运营商

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

减号(“ - ”)不作为操作员处理(但作为一个象征;“ - 而不是#” )(这部分我想我明白了。)

但是,为什么第三个左括号的确被评估为'( - >(list ...(即,列表/表达式分隔符,而不是只是一个像' - above'这样的字面意思)解释器是否在结束分隔符处“向前看”,或者它是否简单地说:“好的,这应该是一个列表。如果右侧没有分隔符,表达无效,这不是我的问题。“?

对不起,有一个令人困惑的问题;煮沸它,我想我的问题是:解释器如何逐步评估上面的列表正确? (也可随意更正术语。)

回答

2

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

如果反引号引用的东西,为什么括号仍然意味着列表,而不是仅仅是文字再吃一块?

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

报价仅仅是给读者的指令,说是这样的:

治疗`(A,B)为(名单“AB)

顿号,使用起来有点像

忽略以上 - 做你平常做的事

我不知道这是否有帮助。如果我是相反的,那么他(我认为这是一个男性的名字?)胜。我只是想在你的脑海中获得更多。

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

+0

“如果反引号引用的话,为什么括号仍然意味着列表,而不仅仅是一个文本?这就是要点,除非我知道这不是文字。 (我写了“符号”,但你的“单词原子”可能更好)。至于你的回答 - 公平地说 - **首先**树根据列表完成,然后**操作是并且反引用是一种操作符,这就是为什么反引用内的列表仍然是列表的原因? (Sill有些困惑。) – 2012-07-22 20:54:10

+0

这是由读者应用的。它在同一时间*完成转换为列表。反引用不像运行时发生的任何事情那样是一个操作符。它是解析输入的代码的特殊指令。它发生在任何评估之前。 – 2012-07-22 21:13:05

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

反引用是一种读取宏。它在READ TIME转换表达式。

这样做:

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

这被解读为实施具体形式。与此类似的东西:

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

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

所以上面的转换是由READER完成的。

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

LIST*取第一个参数,并在最后一个参数arg之前列出它们,这是一个列表。

+0

何时发生读取时间?关于CL,我只听说过编译时间和运行时间(后者在解释模式下) - 我应该说这是在宏观扩展的背景下。 – 2012-07-22 21:02:06

+0

@Emanual Berg:'READ TIME'是READ运行时。当文本s表达式读入Lisp数据时。 – 2012-07-22 21:08:17

+0

你写了一个表达式,然后回车,解释器读取它 - 那是什么时候?而且,你加载一个文件,然后每次读取一行,读取该行,然后读取下一行......? – 2012-07-22 21:12:02