在Scheme中编写Eval过程?

时间:2010-04-12 22:17:41

标签: lisp scheme eval

我的问题不是内置的eval程序,而是如何创建它的简单版本。对于初学者,我希望能够在'(+ 1 2)中使用它,并让它评估表达式+引用通常取消评估的位置。

我一直在考虑这个问题,发现了一些可能有用的东西: Unquote :, (quasiquote) (应用)

我的主要问题是重新获得+作为一个过程而不是一个符号的值。一旦我得到了,我想我应该能够将它与列表中的其他内容一起使用。

非常感谢任何提示或指导。

1 个答案:

答案 0 :(得分:3)

首先,如果你正在做你正在做的事情,你至少可以阅读Metalinguistic AbstractionStructure and Interpretation of Computer Programs部分的第一章。


现在我自己提出一些建议。

使用Scheme(或者实际上是任何Lisp)解释器的符号的常见做法是在某种“环境”中查找它。如果您要编写自己的eval,您可能希望提供自己的环境结构。您可以回退到Scheme系统的一件事是,您在eval之上构建+的初始环境包含consthe-environment等内容的绑定。据我所知,由于各种Scheme系统提供了不同的初始环境(包括interaction-environment特殊形式的MIT Scheme和(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 ...)) ,因此无法以100%便携的方式实现这一点。在(Petite)Chez Scheme ......并且不要问我为什么会这样),但基本想法保持不变:

lambda

请注意,您肯定要检查符号是否需要特殊表单(ifcond - 或者您可以使用if代替{{1} - 但是你可能想要更多并且可能允许扩展到基本集合,即宏。使用上面的框架eval,这必须在我称之为“applicative form”处理程序的地方进行,但是您也可以在处理符号的情况下处理这个问题,或者可以先处理特殊的表单处理程序,然后是常规的符号查找和功能应用。