我一直在阅读SICP (计算机程序的结构和交互),并非常兴奋地发现了这种奇妙的特殊形式:“”,他们演示了如何将它与eval结合使用,作为编写模块化代码的一种方式(摘自关于“包”的4.3节):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))然后,他们演示了它是如何工作的。
((eval 'square-root scientific-library) 4)在他们的例子中,他们接着演示了我想要的用法--一种优雅的、极简主义的在方案中执行"OO“风格的方法.它们把"type“组合在一起,这实际上是由"make-environment”特殊形式(即vtable)和arg (“state”)返回的.
我非常兴奋,因为这正是我一直在寻找的一种在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中提到的“制造环境”发生了什么?这一切看起来都是那么优雅,也正是我想要的,但似乎没有任何现代的方案翻译支持它?
理由是什么?仅仅是“制造环境”有一个不同的名字吗?
更多信息在后面找到
我看了一下在线版本:
4.3
我读的是SICP的第一版。第二版似乎用一个关于非确定性编程和"amp“运算符的章节取代了对包的讨论。
发布于 2009-03-09 08:52:14
经过更多的调查之后,我在新闻网上发现了这个信息线:
“R5RS EVAL和环境说明符是那些非常不喜欢一流环境并希望使用受限EVAL的人和那些在没有第二个参数即环境的情况下无法接受/理解EVAL的人之间的妥协。”
此外,还发现了这一“工作”:
(define-syntax make-environment
(syntax-rules ()
((_ definition ...)
(let ((environment (scheme-report-environment 5)))
(eval '(begin definition
...)
environment)
environment))))
(define arctic
(make-environment
(define animal 'polarbaer))) (取自这)
然而,我最终采用了一种类似于第一个人建议的“消息传递”风格--我返回一个函数列表,并有一个通用的“发送”方法来调用特定函数的名称.就像这样
(define multiply
(list
(cons 'differentiate (...))
(cons 'evaluate (lambda (args) (apply * args)))))
(define lookup
(lambda (name dict)
(cdr (assoc name dict))))
; Lookup the method on the object and invoke it
(define send
(lambda (method arg args)
((lookup method arg) args)))
((send 'evaluate multiply) args)我一直在深入阅读,我意识到,如果我真的想采用一种完全面向对象的风格,那么所有的CLOS都是存在的--但我认为即使在上面也有点过分了。
发布于 2010-01-11 22:55:40
他们是这样写的,因为麻省理工学院计划实际上拥有一流的环境,这大概就是作者计划教他们的班级的(因为这本书是在麻省理工学院写的)。
查看http://groups.csail.mit.edu/mac/projects/scheme/
然而,我注意到MIT计划虽然仍在积极开发,但缺乏真正的现代方案所具有的许多特性,比如外部函数界面或GUI支持。您可能不想将它用于一个严肃的软件开发项目,至少不想单独使用。
发布于 2009-03-06 11:21:08
由于性能原因,方案没有一流的环境。当Scheme被创建时,它并不是最快速的语言,因为它是一流的函数、延续等优秀的语言。添加一流的环境会进一步削弱性能。因此,这是在早期的计划中达成的一种折衷方案。
https://stackoverflow.com/questions/617325
复制相似问题