我正在通过 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/