首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Scheme不支持一流环境?

为什么Scheme不支持一流环境?
EN

Stack Overflow用户
提问于 2009-03-06 00:39:02
回答 4查看 3K关注 0票数 19

我一直在阅读SICP (计算机程序的结构和交互),并非常兴奋地发现了这种奇妙的特殊形式:“”,他们演示了如何将它与eval结合使用,作为编写模块化代码的一种方式(摘自关于“包”的4.3节):

代码语言:javascript
复制
(define scientific-library
  (make-environment
   ...
   (define (square-root x)
    ...)))

然后,他们演示了它是如何工作的。

代码语言:javascript
复制
((eval 'square-root scientific-library) 4)

在他们的例子中,他们接着演示了我想要的用法--一种优雅的、极简主义的在方案中执行"OO“风格的方法.它们把"type“组合在一起,这实际上是由"make-environment”特殊形式(即vtable)和arg (“state”)返回的.

我非常兴奋,因为这正是我一直在寻找的一种在Scheme中进行多态分配的方法,而不必编写大量的显式代码或宏。

也就是说,我想要创建一个“对象”,它有两个函数,我在不同的上下文中调用.但是我不想用"car“和"cdr”来称呼它们,我想用它们的符号名称来声明和评估它们。

不管怎么说,当我读到这篇文章时,我迫不及待地想回家试一试。

试想一下,当我在PLT计划和Chez计划中都经历了以下情况时,我会感到失望:

代码语言:javascript
复制
> (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“运算符的章节取代了对包的讨论。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-09 08:52:14

经过更多的调查之后,我在新闻网上发现了这个信息线

“R5RS EVAL和环境说明符是那些非常不喜欢一流环境并希望使用受限EVAL的人和那些在没有第二个参数即环境的情况下无法接受/理解EVAL的人之间的妥协。”

此外,还发现了这一“工作”:

代码语言:javascript
复制
(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))) 

(取自)

然而,我最终采用了一种类似于第一个人建议的“消息传递”风格--我返回一个函数列表,并有一个通用的“发送”方法来调用特定函数的名称.就像这样

代码语言:javascript
复制
(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都是存在的--但我认为即使在上面也有点过分了。

票数 13
EN

Stack Overflow用户

发布于 2010-01-11 22:55:40

他们是这样写的,因为麻省理工学院计划实际上拥有一流的环境,这大概就是作者计划教他们的班级的(因为这本书是在麻省理工学院写的)。

查看http://groups.csail.mit.edu/mac/projects/scheme/

然而,我注意到MIT计划虽然仍在积极开发,但缺乏真正的现代方案所具有的许多特性,比如外部函数界面或GUI支持。您可能不想将它用于一个严肃的软件开发项目,至少不想单独使用。

票数 5
EN

Stack Overflow用户

发布于 2009-03-06 11:21:08

由于性能原因,方案没有一流的环境。当Scheme被创建时,它并不是最快速的语言,因为它是一流的函数、延续等优秀的语言。添加一流的环境会进一步削弱性能。因此,这是在早期的计划中达成的一种折衷方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/617325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档