在Drracket中哪种语言包适用于SICP?

时间:2013-10-23 15:35:26

标签: scheme sicp dr.racket

我正在尝试使用SICP并获得了一些代码。 所以我开始:

#lang scheme
(word 'comp 'uter)

返回错误:函数(字)未定义。

即使我尝试将其复制到IDE(运行)中:

(define word?
  (let ((number? number?)
        (symbol? symbol?)
        (string? string?))
    (lambda (x)
      (or (symbol? x) (number? x) (string? x)))))

还是一样。

我认为语言版本可能存在某些问题。或者


以上来自“简单方案”,当我在SICP中完全介绍代码时:

(define (sqrt x)
    (sqrt-iter 1.0 x))

IDE返回sqrt-iter未定义。代码可以在第一章找到:http://mitpress.mit.edu/sicp/code/index.html

3 个答案:

答案 0 :(得分:34)

在DrRacket中有一个SICP compatibility language

1。从包管理器

documentation中,有一个简单的指南,介绍如何从DrRacket安装它:

  1. 打开包管理器:在DrRacket中选择菜单“文件”,然后选择“包管理器......”。

  2. 在“Do Do I Mean”选项卡中找到文本字段并输入:“sicp”

  3. 单击“安装”按钮。这会产生大量的输出。即使有警告,也不要担心。

  4. 测试一下。确保DrRacket具有“从源中确定语言” 左下角。编写以下程序并单击 RUN

    #lang sicp 
    
    (inc 42) 
    ; ==> 43
    
  5. 这是一个使用图片语言的更高级测试,需要包含在#%require中:

    #lang sicp
    (#%require sicp-pict)
    
    ;; paint-hires / paint-hi-res renamed to just paint
    (paint (below (beside diagonal-shading
                          (rotate90 diagonal-shading))
                  (beside (rotate270 diagonal-shading)
                          (rotate180 diagonal-shading))))
    

    单击 RUN ,您会在交互窗口中看到一个朝向中心更亮的方块。

    2命令行安装

    或者,您也可以通过运行以下命令从终端/ shell执行步骤1-3:

    raco pkg install sicp
    

    从这里开始,在第一个安装说明中执行步骤4.进行测试。

    3。如果raco pkg不起作用

    ,则使用planet的旧版本或DrRacket

    在DrRacket中还有一个old version of SICP compatibility language。虽然左下角的选择框位于“从源确定语言”,但您可以添加:

    #lang planet neil/sicp
    

    作为定义中的唯一一行(顶部文本区域)并按 RUN ,它将被安装。重新启动DrRacket,您将在语言下拉菜单中找到它。祝好运。 您可能会收到许多红色的错误消息。只需忽略它并重新启动DrRacket。您可能无法在语言菜单中找到该选项,但通过使用#lang planet neil/sicp启动每个文件,它仍可用作模块语言。

    从错误来看,它似乎与图片语言模块有关。我测试了这个片段,它仍然有效:

    (paint-hires  (below (beside diagonal-shading
                                 (rotate90 diagonal-shading))
                         (beside (rotate270 diagonal-shading)
                                 (rotate180 diagonal-shading))))
    

答案 1 :(得分:15)

Sylwester's answer是我想要的。但是,我注意到Racket 6.5有added direct support for SICP。我想人们可能想知道这一点。

现在,在添加SICP支持后,可以在Racket中编写如下代码:

#lang sicp
(#%require sicp-pict)
(paint einstein)

答案 2 :(得分:4)

[开始不错;继续,你会享受Scheme!]

在Scheme中,程序是在一个环境中开发的。环境定义了从标识符到值的映射。一些值是函数,一些是数字等。当你 定义一个函数:

(define (sqrt x)
  (sqrt-iter 1.0 x))

标识符x被绑定为sqrt的参数,值1.0是数字,标识符sqrt-iter来自环境。

要问自己的一个问题是“sqrt-iter定义在哪里;它绑定的是什么?”由于未由您定义,sqrt-iter必须来自您的Scheme内置环境或导入您的Scheme。您没有导入任何内容,并且未在Scheme中定义sqrt-iter(请参阅R5RS或其他资源)。因此sqrt-iter是未绑定的。

同样的逻辑适用于每个标识符,包括您使用word

word?的实现中,使用了syntactic-keyword let来引入新的绑定标识符。当您编写(number? number?)时,您将引入一个新标识符number?(在左侧)并将其绑定到来自环境的number?(右侧)(在Scheme中定义)。使用let这并不是真的在为你买东西。您的word?代码可以实现为:

(define (word? x)
  (or (symbol? x) (number? x) (string? x)))   ;; number?