lisp - 将 ' 转换为 lisp 中的引号

标签 lisp common-lisp

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

谢谢!

最佳答案

Lisp 评估分阶段进行。

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

读者还将 ' 转换为围绕以下形式(可能是列表、符号等)的包装引用形式。 'a(quote a)'(a)> 作为 (quote (a))

Eval 然后只需要一个规则如何处理 quote 作为操作符。它永远不会看到任何 '

关于lisp - 将 ' 转换为 lisp 中的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53183948/

相关文章:

algorithm - Lisp gethash 复杂性

list - 在 Lisp 中不使用 mapcar 将列表中的数字相乘(坐标方式)

clojure - 种植我的 Clojure 树

scheme - 压平一次程序

lisp - 如何在 Lisp 中对 1000 以下可被 3 或 5 整除的所有数字求和?

common-lisp - Common Lisp 中的 "flet"和 "labels"有什么区别?

emacs - 在 Emacs 中,这个错误是什么意思? "Warning: cl package required at runtime"

list - 按数字和字符对列表进行排序

arrays - 如何访问存储在数组中的类对象?

LISP In Small Pieces - 运行代码的最佳 LISP 环境?