【发布时间】:2020-08-16 14:46:21
【问题描述】:
我正在尝试使用 CLISP 实现 eval 函数。
我的动机:假设我有一个这样的 Lisp 程序:
(defun call (arg)
(cond
(some-condition (call (other (strange (functions (on arg)))))
(t nil)
)
)
(defun mysterious-function (arg)
(call (strange (functions (on arg))))
)
(mysterious-function 100) ; only this line can be changed
我想知道(mysterious-function 100) 中实际调用的内容。
目前我的想法如下所示,但障碍是:
- 如何查找符号(目前使用
eval) - 如何获取函数的定义(例如获取
(defun f (x))之类的内容)然后解析它 - 如何检测宏并展开宏
我的方向是否正确?
(defun my-eval (body)
(cond
((typep body 'integer) body)
((typep body 'float) body)
((typep body 'rational) body)
((typep body 'complex) body)
((typep body 'boolean) body)
((typep body 'symbol) (eval body))
((typep body 'list) (eval body))
(t (error))
)
)
(my-eval '(mysterious-function 100))
【问题讨论】:
-
这个问题不清楚。你想为 Common Lisp 写一个评估器吗?或者对于一些小得多的方言,其中评估器是用 in common Lisp 编写的?网上有很多关于如何编写评估器的资源:你看过吗?
-
我正在尝试使用 Common Lisp 为 Common Lisp 编写一个评估器。我发现的大多数在线资源都在使用其他一些非函数式编程语言,例如 Python。我为其他 Lisp 方言找到了一些,但不是 Common Lisp。
-
好吧,我认为为 CL 编写评估器远远超出了堆栈交换答案的范围:它是一种大型工业语言,它的评估器必然会很复杂。不是因为你大概可以直接使用的“库”,而是因为符号宏 &c &c 之类的东西。
-
SICL 可能与您的兴趣相关:github.com/robert-strandh/SICL
标签: lisp common-lisp interpreter