我的问题不是内置的eval程序,而是如何创建它的简单版本。对于初学者,我希望能够在'(+ 1 2)中使用它,并让它评估表达式+引用通常取消评估的位置。
我一直在考虑这个问题,发现了一些可能有用的东西: Unquote :, (quasiquote) (应用)
我的主要问题是重新获得+作为一个过程而不是一个符号的值。一旦我得到了,我想我应该能够将它与列表中的其他内容一起使用。
非常感谢任何提示或指导。
答案 0 :(得分:3)
首先,如果你正在做你正在做的事情,你至少可以阅读Metalinguistic Abstraction的Structure and Interpretation of Computer Programs部分的第一章。
现在我自己提出一些建议。
使用Scheme(或者实际上是任何Lisp)解释器的符号的常见做法是在某种“环境”中查找它。如果您要编写自己的eval
,您可能希望提供自己的环境结构。您可以回退到Scheme系统的一件事是,您在eval
之上构建+
的初始环境包含cons
,the-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
请注意,您肯定要检查符号是否需要特殊表单(if
和cond
- 或者您可以使用if
代替{{1} - 但是你可能想要更多并且可能允许扩展到基本集合,即宏。使用上面的框架eval
,这必须在我称之为“applicative form”处理程序的地方进行,但是您也可以在处理符号的情况下处理这个问题,或者可以先处理特殊的表单处理程序,然后是常规的符号查找和功能应用。