转换';用lisp引用
我正在尝试编写一个仅使用lisp基本函数的lisp解释器。我在写我的评估,但我不确定我如何能检测到'所以我不评估符号。我知道“x”在内部转换为(quote x),我启动了一个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
(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
和symbolX
列表中的car是QUOTE
您是否使用自己的解释器来评估该片段?在Common Lisp中,第一个和第三个参数应该发出错误信号,因为参数是符号而不是列表,而第二个参数应该返回X
。
X