我已经读通过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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top