怎么样,在
中`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4)
减号(“ - ”)不被视为操作符(但作为符号;' - 而不是#' - - 正确吗?)(这部分我想我明白了。)
但是为什么第三个左括号确实被评估为'(
- > (list
...(也就是说,列表/表达式分隔符,而不仅仅是像' - 上面那样的文字?)解释器是否“向前查看”结束分隔符,还是只是说“好吧,这个应该是一个列表。如果右边没有分隔符,表达式无效,这不是我的问题。“?
抱歉这个令人困惑的问题;把它煮沸,我想我的问题是:解释器如何逐步评估上面的列表? (也可以随意更正术语。)
答案 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相矛盾,那么他(我认为这是男性名字?)获胜。我只是想把更多的东西放在你的脑海里。
哦,还有一件事。引用不会使事情“文本”。它使单词原子(和括号列表)。所以它真的不像“制作这个文字”那么简单。