我正试图只使用lisp基元函数来编写一个lisp解释器。我正在写我的eval,但我不确定如何检测",所以我不评估符号。我知道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检测到引号是第一个元素并返回它,但我不确定为什么在最后一个例子中它没有这样做,因为本质上‘x应该转换为(引号x(,然后作为参数传递给我的car。我需要检查eval的一个基本情况,这样如果引号在原子之前,我就不会返回它的值。有没有一种方法可以只使用基元函数来实现这一点?
谢谢!
Lisp评估分阶段进行。
第一阶段是阅读器,它将文本(字符序列(转换为形式,即列表、符号和文字形式(字符、字符串、数字、数组等(
读取器还将'
转换为围绕以下形式(可以是列表、符号等(的换行引号形式。'a
是读作为(quote a)
,'(a)
是读作为(quote (a))
。
那么CCD_ 6只需要一个如何作为运算符来处理CCD_。它从未看到任何'
。
您的lisp解释器的行为与Common lisp不同。你应该得到:
(defun my-car (x) (car x))
(my-car (quote x)) -> Error: Attempt to take the car of A which is not listp.
(my-car '(x)) -> X
(my-car 'x) -> Error: Attempt to take the car of A which is not listp.
(my-car (list 'QUOTE 'X)) -> QUOTE
(my-car ''x) -> QUOTE
(my-car (quote 'x)) -> QUOTE
(my-car '(quote x)) -> QUOTE
循序渐进:
源代码:
(my-car ''x)
分析:
(my-car (quote (quote x)))
评估参数
(#<Function MY-CAR> (quote x))
调用功能:
X
这是因为符号QUOTE
和符号X
的列表的车是QUOTE
。