scheme - 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
解决方案
虽然它与 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 书|网页资源)更好。
请注意,这些都不与现代方案兼容。部分手续变更合同、变更名称或全部更换。将其与通过阅读莎士比亚来学习英语进行比较,因为语法对您没有帮助。
推荐阅读
- python - 熊猫连接字符串,包括按列分组
- python - python中的字符串搜索 - 两个列表
- python - 是否可以在字典中设置 tkinter 条目的顺序?
- sql - 使用 WHERE AND 子句计算唯一记录?
- python-3.x - 保持 3d 距离的负值
- node.js - 来自流的 mailgun 附件。如何应用文件名
- javascript - 以js、html形式计算输入文本
- mysql - 我的 ClientDataSet.ApplyUpdates 没有发布到我的 MySQL 数据库表中?
- bash - bash printf 转义/引用功能背后的基本原理是什么?
- file - 如何销毁文件?