我一直在阅读SICP(计算机程序的构造和解释),很高兴发现这个精彩的特殊形式:“make-environment”,他们在“包”章节4.3的摘录中展示了如何与eval结合使用,作为编写模块化代码的一种方式。
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
他们随后演示了它的工作原理。
((eval 'square-root scientific-library) 4)
在他们的示例中,他们继续展示了我想要的精简、优雅的“OO”风格的Scheme使用方式...他们将一个“类型”(实际上是由“make-environment”特殊形式返回的vtable)和一个参数(“状态”)“cons”在一起...
我非常兴奋,因为这正是我一直在寻找的,在Scheme中通过符号执行多态调度的方法,而不必编写大量显式代码或宏。
也就是说,我想创建一个“对象”,它有两个函数,我在不同的上下文中调用它们...但我不想用“car”和“cdr”来引用它们,我想通过它们的符号名称同时进行声明和评估。
无论如何,当我读到这篇文章时,我迫不及待地想回家尝试一下。
然而,当我在PLT Scheme和Chez Scheme中都遇到以下问题时,我感到非常失望:
> (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"有不同的名称吗?
稍后发现更多信息
我查看了在线版本:
我正在阅读SICP的第一版。第二版似乎用一个关于非确定性编程和"amp"运算符的部分替换了有关软件包的讨论。