常见的Lisp后引号评估:分隔符和运算符



中的情况如何

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

减号("-")不被视为运算符(而是一个符号;'-而不是#'-正确吗?)(我想我理解这一部分。)

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

抱歉问了一个令人困惑的问题;简而言之,我想我的问题是:口译员如何一步一步地正确评估以上列表?(也可以随意更正术语。)

`(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,并将它们保存在最后一个arg之前,后者是一个列表。

我试着想象一下你在想什么导致了混乱。我猜测问题是:

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

如果这就是你所问的,那么答案(大致来说,像雷恩这样的人对lisp的了解比我多得多)就是引用并不像你想象的那么简单。当lisp读取代码时,它由一个叫做"阅读器"的东西处理。它将代码变成一个语法树,一组列表组成了一个包含程序的树。

引用只是给读者的一条指示,上面写着:

将"(a,b)"视为(列表"a,b")

逗号的作用类似

忽略上面的-做你通常做的

我不知道这是否有帮助。如果我反驳了rainer,那么他(我想是男性的名字?)会赢。我只是想多了解你的想法。

哦,还有一件事。引用并不能使事物成为"文本"。它使单词成为原子(和括号列表)。所以它真的不像"制作这个文本"那么简单。

最新更新