我正在通过 SICP 作为自学并且在第 2 章中的图片语言部分。我一直在使用 DrRacket 进行早期的练习,但是在尝试基于“绘制线”进行练习时出现编译错误本书这一部分的图片功能。

具体来说,这段代码...

(define (segments->painter segment-list)
 (lambda (frame)
  (for-each
   (lambda (segment)
    (draw-line
     ((frame-coord-map frame) (start-segment segment))
     ((frame-coord-map frame) (end-segment segment))))
 segment-list)))

...产生此错误...
draw-line: unbound identifier in module in: draw-line

所以我在这个论坛上做了一些研究,并安装了 Neil Van Dyke 提供的 SICP 包(http://www.neilvandyke.org/racket-sicp/#(part._usage))。我按照所有步骤操作,按照指示将语言更改为 SICP,但仍然出现相同的错误。

我假设这个包的目的是定义这个“内置”函数(以及书中的其他函数)。只是为了预测一些问题,我在文件中没有“要求”语句并使用“#lang Planet neil/sicp”来指定语言而不是使用菜单(我还尝试使用菜单将语言更改为 SICP 并获得一个更奇怪的错误;请参阅下面的附言)。我的环境是Windows 7,DrRacket的版本是5.3.1。

也许我只是犯了一个菜鸟错误;任何见解将不胜感激。

谢谢。

PS:对于那些感兴趣的人,当我使用菜单将语言设置为“SICP(PLaneT 1.17)”时,对于我尝试编译的任何定义(即使是最微不足道的),我都会收到以下错误...
<unsaved editor>:1:0: #%top-interaction: unbound identifier;
also, no #%app syntax transformer is bound in: #%top-interaction

最佳答案

在 Racket 中,这些定义解决了我在 SICP 第 2 章中的绘图问题,我成功解决了之后的练习:

(require graphics/graphics)
(open-graphics)
(define vp (open-viewport "A Picture Language" 500 500))

(define draw (draw-viewport vp))
(define (clear) ((clear-viewport vp)))
(define line (draw-line vp))

(define (make-vect x y)
  (cons x y))

(define (xcor-vect v)
  (car v))

(define (ycor-vect v)
  (cdr v))

(define (add-vect v1 v2)
  (make-vect (+ (xcor-vect v1)
                (xcor-vect v2))
             (+ (ycor-vect v1)
                (ycor-vect v2))))

(define (sub-vect v1 v2)
  (make-vect (- (xcor-vect v1)
                (xcor-vect v2))
             (- (ycor-vect v1)
                (ycor-vect v2))))

(define (scale-vect s v)
  (make-vect (* s (xcor-vect v))
             (* s (ycor-vect v))))


(define (make-frame origin edge1 edge2)
  (list origin edge1 edge2))

(define (origin-frame f)
  (car f))

(define (edge1-frame f)
  (cadr f))

(define (edge2-frame f)
  (caddr f))

(define (frame-coord-map frame)
  (lambda (v)
    (add-vect
     (origin-frame frame)
     (add-vect (scale-vect (xcor-vect v)
                           (edge1-frame frame))
               (scale-vect (ycor-vect v)
                           (edge2-frame frame))))))

关于scheme - 在 DrRacket 中编译 SICP 图片练习?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13592352/

10-14 07:53