我试图只使用lisp基本函数来编写lisp解释器我在写我的评估,但我不确定我如何能检测到'所以我不评估符号。我知道“x”在内部被转换为(引用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检测到quote作为第一个元素并返回它,我不确定为什么在最后一个示例中它不这样做,尽管实际上'x应该转换为(quote x),然后作为参数传递给我的car我需要检查我的eval的一个基本情况,以便如果引用在原子之前,我不会返回它的值有没有办法只用基本函数来实现这个目的?
谢谢!
最佳答案
Lisp评估分阶段进行。
第一阶段是读取器,它将文本(字符序列)转换为表单,即列表、符号和文本表单(字符、字符串、数字、数组等)。
读取器还将'
转换为围绕以下表单(可能是列表、符号等)的包装引用表单'a
读作(quote a)
,'(a)
读作(quote (a))
。Eval
然后只需要一个规则,如何作为运算符处理quote
它从未看到任何'
。
关于lisp - 将'转换为lisp的报价,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53183948/