首页 > 解决方案 > DrRacket 中的计划合同违规

问题描述

我正在archive.org上关注Brian Harvey 的SICP 讲座我正在使用DrRacket v7.4 IDE 来编写我的Scheme 代码。在 06:39,Brian Harvey 教授展示了如何选择字符串的第一个字符。当我完全遵循这种方法时,我没有得到预期的结果,如下所示。为什么会这样?

我的代码如下所示:

# lang scheme

(first 'hello)

预期结果:

h

错误信息:

first: contract violation
expected: (and/c list? (not/c empty?))
given: hello

标签: scheme

解决方案


虽然它与 SICP 是同一门科学课程,但它不是魔术师所做的普通 SICP。Brian Harvey 清楚地使用了他在另一本关于 Scheme 的书中使用的一些程序,称为 Simply Scheme(在线免费 pdf | Amazon)。

在其中,他使用术语单词和句子,并制作了一种面向对象的过程,如果是字符串或符号,(first var)则返回第一个字母,如果是列表,则返回第一个“单词”(元素)。var由于担心侵犯版权,它在 PDF 版本的第 531 页上进行了定义。

无论如何,它不是标准的,所以为了让它工作,他要么加载了程序,要么制作了一个在启动时定义它们的 ini 文件。在 Racket 中,您可以通过创建自己的语言或需要库来做同样的事情。果然有人花时间在 Racket 中将它创建为一种语言,所以你可以这样做:

#lang simply-scheme
(se (butlast (bf "this"))
    "world")

第一次运行它时,它会在底部询问安装 Simply Scheme。只需按安装,完成后再次运行。

虽然我不反对 Brian Harvey,但我认为这并不比在 DrRacket中也有自己的语言的原始 SICP(视频| html 书|网页资源)更好。

请注意,这些都不与现代方案兼容。部分手续变更合同、变更名称或全部更换。将其与通过阅读莎士比亚来学习英语进行比较,因为语法对您没有帮助。

其他资源,如如何设计程序(html 书)、Rackets 自己和推荐的书,以及我最喜欢的 Racket 领域(网页)。


推荐阅读