我一直在阅读 SICP(计算机程序的结构和解释),并且非常兴奋地发现了这种奇妙的特殊形式:“make-environment”,他们演示了将其与 eval 结合使用作为编写模块化代码的一种方式(摘录来自第 4.3 节“包”):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
然后他们展示了它是如何工作的
((eval 'square-root scientific-library) 4)
在他们的例子中,他们接着准确地展示了我想要的用法——一种优雅的、极简主义的方式在方案中做“OO”风格......他们“cons”在一起一个“type”,这实际上是什么由“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-ZH-28.html#%_sec_4.3
我正在读的是SICP的第一版。第二版似乎用关于非确定性编程和“amp”运算符的部分取代了对包的讨论。