我将通过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,但仍然得到相同的错误 .
我认为这个软件包的目的是定义这个“内置”函数(以及书中的其他函数) . 只是为了预测一些问题,我在文件中没有'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
4 回答
在Racket中,这些定义通过SICP第2章中的图纸解决了我的问题,之后我成功地解决了这些练习:
我要感谢alinsoar,火烈鸟和奥斯卡提供的非常有用的建议 .
我决定采用奥斯卡的方法(显然)使用球拍图形库,而不是由Neil Van Dyke组装的特殊包装(我根本没有运气) . 这是我的代码的重要部分(不依赖于图形库的定义):
所以,有几点需要注意:
1)如上所述,这使用标准的球拍语言,而不是Neil Van Dyke实施目的的SICP语言 .
2)此库中的“绘制线”功能将视口(基本上是一个窗口)作为参数,并创建一个函数,该参数获取参数的两个坐标(以及我未使用的可选颜色参数) . 然而,在这种情况下,'坐标'不是练习使用的简单向量 . 坐标是struct'posn'的实例,它基本上只是x和y值的包装器 .
这个posn数据类型的存在意味着我必须先用posn构造函数包装我的向量,然后才能在'segments-painter'函数中使用它们 . ('vector-to-posn'函数就是这个包装器) . 还要注意,书中对'segments-painter'的定义中使用的'draw-line'一词被'line'取代,'line'被定义为(draw-line vp) .
3)有趣的是,球拍图形库定义的视口坐标与我预期的略有不同 . 坐标(0 0)是帧中的 top 左侧点(我猜左下角),(1 1)位于右下角 . (注意,这里我说的是单位平方 . 在我在上面的代码中使用的框架中,右下角的真实坐标将是(500 500) . )
由于我正在进行的练习(2.49)涉及绘制关于水平轴对称的图形,这个小皱纹并不重要,但否则它可能会让你感到惊讶 . 在我看来,围绕这种“反转”的一种方法是使用书中的“翻转”功能,但我没有花时间去做 .
再次感谢您的帮助!
我也使用DrRacket进行SICP练习 . 因此,为了使用绘图功能,您应该在源文件的顶部添加以下行:
然后你应该设置图形上下文,如下所示:
在此之后你可以画一条线:
并将结果保存到文件中:
这是第2章练习的my solution
对于大多数练习来说,从行星加载sicp模块并在每个文件的顶部添加以下语言声明就足够了:
#lang planet neil/sicp
对于图片语言问题,请改用:
#lang planet neil/sicp (#%require sicp-pict)
缺少以下内容:
波:
罗杰斯:
替换为替代原语
einstein
如果您还想为练习2.49实现自己版本的sicp-pict模块,可能最简单的方法是在htdp教学语言中使用图像库 . 将以下内容放在程序的顶部: