2

怎么样,在

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

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

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

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

4

2 回答 2

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*接受第一个 args 并将它们放在最后一个 arg 之前,这是一个列表。

于 2012-07-22T15:32:10.280 回答
2

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

如果反引号引用了一些东西,为什么括号仍然意味着列表,而不仅仅是一段文本?

如果这就是你要问的,那么引用并不像你想象的那么简单(大致 - 像 Rainer 这样的人对 lisp 的了解比我多得多)。当 lisp 读取代码时,它由一个叫做“阅读器”的东西处理。这会将代码变成语法树——一堆列表,形成包含程序的树。

quoting 只是给读者的一条指令,内容如下:

将 `(a ,b) 视为 (list 'ab)

逗号的作用类似于

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

我不知道这是否有帮助。如果我在反驳雷纳,那么他(我认为这是一个男性名字?)赢了。我只是想深入你的脑海。

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

于 2012-07-22T17:45:57.847 回答