转换';用lisp引用

转换';用lisp引用,lisp,common-lisp,Lisp,Common Lisp,我正在尝试编写一个仅使用lisp基本函数的lisp解释器。我在写我的评估,但我不确定我如何能检测到'所以我不评估符号。我知道“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

我正在尝试编写一个仅使用lisp基本函数的lisp解释器。我在写我的评估,但我不确定我如何能检测到'所以我不评估符号。我知道“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检测到quote是第一个元素并返回它,我不确定为什么在最后一个例子中它不这样做,因为本质上“x”应该转换为(quote x),然后作为参数传递给我的car。我需要为我的eval的一个基本情况检查这个,这样如果一个引号在atom之前,我就不会返回它的值。有没有一种只使用基本函数的方法


谢谢

Lisp评估分阶段进行

第一个阶段是阅读器,它将文本(字符序列)转换为形式,即。E列表、符号和文字形式(字符、字符串、数字、数组等)

读取器还将
转换为围绕以下表单(可能是列表、符号等)的包装报价表单<代码>'a读作
(引号a)
'(a)
读作
(引号a))


Eval
则只需要一条规则,作为操作员如何处理
quote
。它从未看到任何

您的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))

这是因为symbol
QUOTE
和symbol
X
列表中的car是
QUOTE

您是否使用自己的解释器来评估该片段?在Common Lisp中,第一个和第三个参数应该发出错误信号,因为参数是符号而不是列表,而第二个参数应该返回
X
X