我正在尝试仅使用 lisp 原始函数编写 lisp 解释器。我正在写我的 eval 但我不确定如何检测 ' 所以我不评估符号。我知道 'x 在内部转换为 (quote x),我启动了一个 lisp 解释器并尝试了以下操作:
(defun my-car (x) (car x))
(my-car (quote x)) -> QUOTE
(my-car '(x)) -> QUOTE
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.
我看到在前两个示例中 car 将引号检测为第一个元素并返回它,但我不确定为什么它在最后一个示例中不这样做,因为本质上 'x 应该转换为 (quote x) 然后作为参数传递给 my-car。我需要针对 my-eval 的基本情况之一检查这一点,以便如果引号在原子之前,我不会返回它的值。有没有办法只使用原始函数来做到这一点?
谢谢!
最佳答案
Lisp 评估分阶段进行。
第一阶段是阅读器,它将文本(字符序列)转换为形式,即。 e.列表、符号和文字形式(字符、字符串、数字、数组等)。
读者还将 '
转换为围绕以下形式(可能是列表、符号等)的包装引用形式。 'a
被读为(quote a)
,'(a)
被读> 作为 (quote (a))
。
Eval
然后只需要一个规则如何处理 quote
作为操作符。它永远不会看到任何 '
。
关于lisp - 将 ' 转换为 lisp 中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53183948/