Lisp 在Scheme中编写评估程序?
我的问题不在于内置的eval过程,而是如何创建一个简单的版本。刚开始的时候,我希望能够把它放在“(+12)中,让它计算表达式+,引用通常会去掉计算 我一直在思考这个问题,发现了一些可能有用的东西: Unquote:, (准晶石) (适用) 我的主要问题是重新获得+作为一个过程而不是一个符号的价值。一旦我得到了它,我想我应该能够将它与列表中的其他内容一起使用Lisp 在Scheme中编写评估程序?,lisp,scheme,eval,Lisp,Scheme,Eval,我的问题不在于内置的eval过程,而是如何创建一个简单的版本。刚开始的时候,我希望能够把它放在“(+12)中,让它计算表达式+,引用通常会去掉计算 我一直在思考这个问题,发现了一些可能有用的东西: Unquote:, (准晶石) (适用) 我的主要问题是重新获得+作为一个过程而不是一个符号的价值。一旦我得到了它,我想我应该能够将它与列表中的其他内容一起使用 任何提示或指导都将不胜感激。首先,如果你正在做你正在做的事情,你至少可以阅读本节的第一章 现在我想听听自己的一些建议 对于Scheme(或
任何提示或指导都将不胜感激。首先,如果你正在做你正在做的事情,你至少可以阅读本节的第一章
现在我想听听自己的一些建议 对于Scheme(或者任何Lisp)解释器的符号,通常的做法是在某种“环境”中查找它。如果您要编写自己的
eval
,则可能需要提供自己的环境结构。有一件事你可以回到你正在构建eval
的Scheme系统,那就是初始环境包含了+
,cons
等绑定。;据我所知,这不可能以100%可移植的方式实现,因为各种方案系统提供了不同的初始环境获取方式(包括MIT方案中的环境
特殊形式和(小)Chez方案中的交互环境
…不要问我为什么会这样),但基本理念保持不变:
(define (my-eval form env)
(cond ((self-evaluating? form) form)
((symbol? form)
;; note the following calls PCS's built-in eval
(if (my-kind-of-env? env)
(my-lookup form env)
;; apparently we're dealing with an environment
;; from the underlying Scheme system, so fall back to that
;; (note we call the built-in eval here)
(eval form env)))
;; "applicative forms" follow
;; -- special forms, macro / function calls
...))
请注意,您肯定希望检查符号是否命名了特殊的形式(
lambda
和if
是必要的,或者您可以使用cond
代替if
,但您可能需要更多,并且可能允许扩展到基本集合,即宏)。对于上面的框架eval
,这必须在我称之为“应用程序表单”的处理程序中进行,但是您也可以在处理符号的地方处理它,或者可能首先放置特殊表单处理程序,然后是常规符号查找和函数应用。是否允许在+
符号上使用eval
?不,我相信关键是要编写自己的eval。它不需要像内置的那样广泛。