具体来说,这段代码...
(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,但仍然出现相同的错误。
我认为此软件包的目的是定义这个“内置”函数(以及书中的其他函数)。提前预测一些问题,我的文件中没有'require'语句,并使用'#lang planet neil/sicp'来指定语言,而不是使用菜单(我还尝试使用菜单将语言更改为SICP,但得到了一个更奇怪的错误;请参见下面的附言)。我的环境是Windows 7,DrRacket的版本是5.3.1。
也许我只是犯了一个新手错误;任何见解都将不胜感激。
谢谢。
附言:对于那些感兴趣的人,当我使用菜单将语言设置为'SICP(PLaneT 1.17)'时,我会获得以下任何定义尝试编译的错误(即使是最微不足道的定义)...
<unsaved editor>:1:0: #%top-interaction: unbound identifier;
also, no #%app syntax transformer is bound in: #%top-interaction
draw-line
的实现。 话虽如此,这个遗漏似乎是有意为之的,因为它除了在segments->painter
中没有被任何人使用,而且segments->painter
已经作为库的一部分提供给你了。其他人已经向你展示了如何使用DrRacket的原始绘图库从头编写draw-line
,但是对于SICP的图片语言练习,你也不需要直接使用它。 - dyoosegments->painter
撰写定义。你可以在DrRacket中看到它是如何完成的:http://planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/prmpnt.scm。因此,在那里有一个`draw-line`的定义(实际上,在那里它被称为`draw-line-on-screen`),但作为图片语言的用户,你不应该使用它。 - dyoo