【问题标题】:conversion of ' to quote in lisp在 lisp 中将 ' 转换为引号
【发布时间】:2018-11-07 05:19:39
【问题描述】:

我正在尝试仅使用 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.

我看到在前两个示例中,汽车检测到引号是第一个元素并返回它,我不确定为什么在最后一个示例中它不这样做,因为本质上 'x 应该转换为 (quote x) 然后作为参数传递给 my-car。我需要检查 my-eval 的基本情况之一,这样如果引用在原子之前,我就不会返回它的值。有没有办法只使用原始函数来做到这一点?

谢谢!

【问题讨论】:

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

标签: lisp common-lisp


【解决方案1】:

Lisp 评估分阶段进行。

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

阅读器还将' 转换为以下形式(可能是列表、符号等)的包装引号形式。 'a读取(quote a)'(a)读取(quote (a))

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 2011-01-13
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多