【发布时间】:2012-11-15 13:16:43
【问题描述】:
我正在通过 SICP 作为自学并在第 2 章的图片语言部分。我一直在使用 DrRacket 进行早期练习,但在尝试基于“draw”进行练习时出现编译错误-line' 本书这一部分的图片功能。
具体来说,这段代码...
(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。
也许我只是犯了一个菜鸟错误;任何见解将不胜感激。
谢谢。
PS:对于那些感兴趣的人,当我使用菜单将语言设置为“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 的图片语言练习。 -
接下来,您正在阅读的该段落是针对图片语言的实施者,而不是图片语言的用户。实现者将编写
segments->painter的定义。你可以在 DrRacket 中看到它是如何完成的:planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/…。所以里面有draw-line的定义(其实里面叫draw-line-on-screen),但是你不应该把它作为图片语言的用户来使用。 -
非常有趣。显然,我做的工作比我需要的多得多——请参阅我的第二个帖子。感谢 dyoo 的输入。