在通用Lisp中实现Lisp eval函数

在通用Lisp中实现Lisp eval函数,lisp,common-lisp,interpreter,Lisp,Common Lisp,Interpreter,我正在尝试使用CLISP实现eval函数 我的动机:假设我有这样一个Lisp程序: (解除调用(arg) (续) (某些条件(调用(其他(奇怪的(函数)(在arg上)')) (无) ) ) (解除神秘功能(arg) (调用(奇怪的(函数(在arg上))) ) (神秘功能100);只能更改此行 我想知道在(神秘函数100)中实际调用了什么 目前我的想法如下,但障碍是: 如何查找符号(当前使用eval) 如何获取函数的定义(例如,获取类似(defun f(x)))的内容,然后对其进行解析 如何检测

我正在尝试使用CLISP实现
eval
函数

我的动机:假设我有这样一个Lisp程序:

(解除调用(arg)
(续)
(某些条件(调用(其他(奇怪的(函数)(在arg上)'))
(无)
)
)
(解除神秘功能(arg)
(调用(奇怪的(函数(在arg上)))
)
(神秘功能100);只能更改此行
我想知道在
(神秘函数100)
中实际调用了什么

目前我的想法如下,但障碍是:

  • 如何查找符号(当前使用
    eval
  • 如何获取函数的定义(例如,获取类似
    (defun f(x))
    )的内容,然后对其进行解析
  • 如何检测宏并将其展开
  • 我的方向正确吗

    (取消我的评估(车身)
    (续)
    ((typep body'integer)body)
    ((typep主体浮动)主体)
    ((typep body'rational)body)
    ((typep主体“复合体”主体)
    ((typep body'boolean)body)
    ((字体主体符号)(评估主体))
    ((类型主体列表)(评估主体))
    (t(错误))
    )
    )
    (我的评估(神秘功能100))
    
    代码中的大多数情况都可以用一个复选框替换:
    ((constantp body)body)

    至于其他情况:

    • 您可以使用
      boundp
      检查符号是否具有全局值
    • 要查找全局符号值,可以使用
      symbol value
    • fboundp
      可用于检查符号是否全局绑定到函数
    • 要查找全局函数,您可以使用
      symbol function
      访问其函数对象,有时还可以使用
      function lambda expression
      从函数对象检索可解析的源代码列表。有时这不起作用,因为内置的CLISP函数可以在C中定义
    • 要检查符号是否具有关联的全局宏,请使用
      宏函数
      (如果有,则返回非nil)
    • 要展开宏窗体,请使用
      macroexpand
    您可能还需要使用
    special-operator-p
    检测特殊运算符,并相应地处理它们

    我认为,如果您尽可能地将解释的代码限制为宏和用户定义的函数,那么您试图做的事情就会简化。
    我记得读过一篇关于遗传编程中使用快速求值函数来跳过求值代码的宏扩展阶段的文章,它的方法看起来与您的想法类似。

    这个问题还不清楚。您想为Common Lisp编写求值器吗?还是为一些较小的方言编写求值器,其中求值器是用Common Lisp编写的Lisp?网上有很多关于如何编写求值器的资源:你看过吗?我正在尝试使用Common Lisp为Common Lisp编写求值器。我找到的大多数在线资源都使用其他非函数编程语言,如Python。我找到了一些其他Lisp方言的求值器,但不是Common Lisp。好的,我想为CL编写求值器远远超出了堆栈交换的范围:它是一种大型工业语言,而且它的求值器必然会很复杂。这不是因为你可以随便使用的“库”,而是因为象symbol macros&c&c.SICL这样的东西可能与你的兴趣有关:函数y你提到的似乎是一个很好的起点。但是,我放弃了实现它,因为要实现我所需要的所有函数,有太多的东西要写。关于
    constantp
    :对于
    (+1 2 3)
    ,它返回true,所以我仍然需要处理所有可能的情况。