题
我已经读通过sic颗粒(结构和Interpration的计算机程序),是很兴奋地发现这个美好特殊的形式:"让-环境",它们表现出要使用在组合与eval作的写作方式模块代码(摘自第4.3节关于"包裹"):
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
然后,他们展示它是如何工作有
((eval 'square-root scientific-library) 4)
在他们的例子,然后他们去证明 到底 的使用情况,我会想要一个优雅的,简约的方式这样做的"O"式的方案...他们"cons"在一起"类型",这实际上是什么是返回的"化环境中的"特殊形式(即该虚表),以及arg("国家")...
我非常兴奋,因为这是 到底 我一直在寻找一种方法来做到多晶型分派"符号"在方案没有编写大量的明确的代码或宏。
即我想创建一个"对象",这已经说, 两个 功能,我呼吁在不同的情况下...但我不想要提到他们通过"车辆"和"cdr",我想要两个 声明 和 评估 他们通过自己的符号的名字。
无论如何,当我读到这个,我等不及要得到家庭和尝试。
想象我的失望,然后,当我经历过的以下两个小板方案和Chez方案:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
发生了什么"让-环境"中引用的sic颗粒?这一切似乎那么优雅,到底是什么我想要的,但它似乎并不支持在任何现代化方案的口译员?
有什么理由?它只是说,"让-环境的"有一个不同的名字吗?
更多信息的发现后
我在看的网上版本:
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-28.html#%_sec_4.3
我读物的第一版sic颗粒的.第二版的出现必须替换的讨论软件包的一部分上的不确定性的程和"放"操作者。
解决方案
后更多的周围挖我发现了这个 翔实的螺纹 在newsnet:
"该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)))
(取自 此)
但是,我结束了采取一种"传递消息"的风格有点像是第一个建议-我返回的一个列表的职能,并有一个通用的"发送"的方法援引一个特定功能的名字...i。e这样的事情
(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)
我已经进一步阅读,我知道,还有所有的克洛斯如果我真的想采取一种全面的风格-但我认为,即使上述有些矫枉过正。
其他提示
方案没有一流的环境,因为业绩的原因。当方案创建的,也不是最快的语言,围绕由于漂亮的东西,如第一级职能的延续等。添加第一级环境会残废的性能更进一步。因此,它是一种交易在早期计划的日子。
他们写的那样,因为麻省理工学院的方案不,事实上,拥有一流的环境,并推测这是家规划教他们的类(因为这本书是写在麻省理工学院).
检查了 http://groups.csail.mit.edu/mac/projects/scheme/
然而,我注意到麻省理工学院的方案,同时仍然有一些积极的发展,缺少许多的特征,一个真正现代化的方案将有一个外国的接口功能或GUI支持。你可能不会想使用它的一个严重的软件开发项目,至少不是由本身。
将一典型的调度职能的工作?我认为这是类似于你在找什么。
(define (scientific-library f)
(define (scientific-square-root x) (some-scientific-square-root x))
(cond ((eq? f 'square-root) scientific-square-root)
(else (error "no such function" f))))
(define (fast-library f)
(define (fast-square-root x) (some-fast-square-root x))
(cond ((eq? f 'square-root) fast-square-root)
(else (error "no such function" f))))
((scientific-library 'square-root) 23)
((fast-library 'square-root) 23)
你甚至可以结合,例如科学和快速的图书馆变成一个大的派遣方法:
(define (library l f)
(define (scientific-library f)
...)
(define (fast-library f)
...)
(cond ((eq? l 'scientific) (scientific-library f))
((eq? l 'fast) (fast-library f))
(else (error "no such library" l))))
(library 'fast 'square-root)