中的情况如何
`(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,那么他(我想是男性的名字?)会赢。我只是想多了解你的想法。
哦,还有一件事。引用并不能使事物成为"文本"。它使单词成为原子(和括号列表)。所以它真的不像"制作这个文本"那么简单。