在 Lisp 中将 ' 转换为引号



我正试图只使用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

最新更新