【发布时间】:2010-10-11 15:59:25
【问题描述】:
我一直在阅读 SICP(计算机程序的结构和解释),并且非常兴奋地发现了这种奇妙的特殊形式:“make-environment”,他们演示了将其与 eval 结合使用作为编写模块化的一种方式代码(摘自第 4.3 节“包”):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
然后他们演示它是如何工作的
((eval 'square-root scientific-library) 4)
在他们的示例中,然后他们继续演示完全我想要的用法 - 一种优雅、简约的方式在方案中执行“OO”样式...他们“cons”在一起一个“类型”,实际上是“make-environment”特殊形式(即vtable)返回的内容,以及一个arg(“状态”)......
我非常兴奋,因为这正是我一直在寻找的一种方法,可以在 Scheme 中“按符号”进行多态调度,而无需编写大量显式代码或宏。
即我想创建一个“对象”,它有,比如说,两个函数,我在不同的上下文中调用......但我不想用“car”和“cdr”来引用它们,我想通过它们的符号名称来声明和评估它们。
无论如何,当我读到这篇文章时,我迫不及待地想回家尝试一下。
想象一下,当我在 PLT 计划和 Chez 计划中遇到以下情况时,我会感到失望:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
SICP 中提到的“make-environment”发生了什么?这一切看起来都如此优雅,正是我想要的,但似乎任何现代 Scheme 解释器都不支持它?
理由是什么?仅仅是“make-environment”的名称不同吗?
更多信息稍后发现
我看了看在线版本:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-28.html#%_sec_4.3
我读的是SICP的第一版。第二版似乎用关于非确定性编程和“amp”运算符的部分取代了对包的讨论。
【问题讨论】: