什么是最适合学习SICP的Scheme实现?

74

我一直在使用PLT Scheme,但是它存在一些问题。 有没有人知道一个更好的实现来处理SICP?

8个回答

95

使用Racket(前身为PLT Scheme)。

DrRacket IDE是所有Scheme相关内容的绝佳起点,包括SICP。

要在文档中查找关键字,请将光标放在关键字上,然后按F1。在DrRacket中,您现在可以直接在REPL(读取-求值-打印循环)中看到图像。

Neil van Dyke的DrRacket SICP支持

更新(2016年):新的SICP软件包位于http://pkgs.racket-lang.org/#[sicp]。使用软件包管理器(在DrRacket中)下载它或使用raco手册

更新2(2016年):如果您想尝试SICP图片语言的新实现,请下载sicp-pict2.rkt


更新3(2020年):sicp-lang软件包包括sicp语言和sicp图片语言的实现。

文档:DrRacket SICP支持
源代码:GitHub上的sicp-lang
Racket软件包:sicp-lang软件包信息

注意: 图形语言比书中描述的图形语言具有更多功能(如颜色和更大的尺寸)。源代码包含示例: https://github.com/sicp-lang/sicp/blob/master/sicp-pict/main.rkt


7
注意:Neil van Dyke为Racket编写了一个非常好的SICP包。请使用它,而不是我的旧包。 - soegaard
因为DrRacket根本不起作用,所以我要点踩。如果按照sicp插件文档中所述编写#lang sicp,你只会得到read-syntax: #lang not enabled的错误提示。 - Philipp Ludwig
@PhilippLudwig 你需要先安装sicp包。在DrRacket的第一个菜单中选择软件包管理器。 - soegaard
@soegaard 我已经尝试过了,但还是不行。我就这样放弃了,但还是感谢你的支持。 - Philipp Ludwig
1
@soegaard 好的,我明白了。你需要在上面的窗口中输入 #lang sicp ,而不是在下面的提示符中输入。我之前没有意识到这一点。 - Philipp Ludwig
显示剩余11条评论

68

使用MIT Scheme

这是SICP的作者推荐的,也是在MIT进行6.001: 计算机程序的构造和解释课程中使用的技术。


18
我不喜欢 MIT Scheme 的一点是,我无法弄清楚如何在命令行中简单地执行 Scheme 脚本并在控制台上显示其输出 - 就像运行 Python 或 Ruby 脚本的方式一样。难道我太笨了吗?如何实现这一点,而无需启动大型交互式 Emacs 环境,然后每次都要退出它? - Jonathan Hartley
这里有一个预先构建的64位版本的mit-scheme - [http://www-users.cselabs.umn.edu/classes/Fall-2010/csci1901/mit-scheme-x64_9.0.1-1_amd64.deb] - tutysara
刚刚成功地在Ubuntu X64上使用GNU网站提供的源代码编译了它。 - Bernard Notarianni
@f4hy 我怀疑32位版本在x86_64上可以正常工作。 - offby1
3
执行命令行中的程序:https://dev59.com/1oHba4cB1Zd3GeqPRnm2 - Gringo Suave
3
@JonathanHartley 您好,如何在MIT-Scheme中执行一个.scm脚本(不在REPL中)? - Flux

13

在 macOS 上完成这件事情其实相当让人头疼。以下是今天(假设您已经安装了 Homebrew)的解决方法。(偶尔需要运行brew update)。

brew cask install racket
raco setup  # might be optional
raco pkg install sicp

现在你可以 (require sicp) 或者直接运行

racket -l sicp --repl

你可能想省略为 scheme。在bash中就是:
alias scheme='racket -l sicp --repl'

你可以将其添加到~/.bashrc中。


12

MIT/GNU Scheme是与SICP兼容的Scheme解释器,你需要加载SICP兼容(它们提供了特定的库以增强确保SICP练习的工作)。


6

我这周刚开始学习SICP。

目前,在Ubuntu Linux(9.04“jaunty”)中,MIT Scheme无法正常工作。也许将来会修复。

DrScheme可以使用,并且运行良好。您可以使用上面列出的soegard包或Neil Van Dyke的包,后者基于soegard的包,并可从http://www.neilvandyke.org/sicp-plt/获取。这个包的好处是安装后,可以使用“语言|选择语言...”菜单项选择SICP。


2

CHICKEN Scheme有一个sicp库,为SICP提供支持。您可以通过运行chicken-install sicp来安装它,并在源代码开头写下这个:(use sicp)


2
使用 CHICKEN Scheme 5.2.0,我们使用两个 SRFI:203 和 216。chicken-install srfi-203chicken-install srfi-216 - Ludovic Kuty

1

PLT Scheme 运行得相当不错,或者像 Keparo 建议的那样使用 MIT Scheme。你遇到了什么问题呢?


0

我现在正在使用Chez Scheme学习SICP。这是一种相当古老的Scheme方言,因此它与SICP编写时的环境应该差别不大。

请注意,Chez Scheme项目页面提供了一个Windows二进制文件和源代码,可以在类Unix平台上构建。但如果你使用的是Mac,你可能需要执行以下操作:

brew chezscheme
man chez

假设你已经安装了homebrew,这是你真的应该做的。

为什么不用MIT Scheme?因为交互式前端是Edwin,一个使用EMACS约定的编辑器。(目前,它是一个实际的EMACS模式,尽管它曾经是用Scheme实现的。)我曾经知道基本的EMACS,但我的技能因为不用而萎缩了,这告诉我重新学习这个编辑器根本不值得麻烦。

为什么不用DrRacket?如果我看到了@frederick-squid的brew说明,我可能会尝试一下。相反,我试图遵循scheme和sicp的官方说明,但它们已经过时了。然后我试图让IDE进入scheme模式,这似乎很直观,但实际上并不是。

太麻烦了。而且我不确定我是否想要进入一个花哨的语言设计IDE,特别是一个对Scheme支持不佳的IDE引发了最初的问题。


你不必使用Edwin来运行MIT-Scheme。Edwin只是在命令行脚本上指定的选项,你可以更改。我在Emacs(24)下运行MIT-Scheme,将其设置为默认的scheme实现,这样M-x 'run-scheme'立即启动我想要的MIT环境(mechanics/scmutils)。如果你好好想想,它其实很容易。而且带有“#lang sicp”选项的Dr Racket界面也非常好用,我们已经走过了漫长的发展历程... (所有这些都在Ubuntu 16.04 LTS上完成) - Alex Gian
你有没有注意到我说过我不想重新学习 EMACS?如果你能指导我如何将 MIT Scheme 与我喜欢的编辑器集成,提供这些命令行文档将是非常有用的信息。 - Isaac Rabinovitch
抱歉,我手头没有文档,但MIT-Scheme不与任何编辑器绑定。如果您切换到您的mit-scheme安装目录(只有一个bin和一个lib目录),则以下命令应该可以让您开始:>> bin/mit-scheme --library ./lib --heap 120000 <<。之后,您可以使用您“最喜欢的编辑器”进行配置。或者只需使用命令行作为repl,并从ed中加载任何文件。 - Alex Gian
1
所以,我应该说“除非你愿意使用一个复杂的、未经记录的黑客”,否则你必须使用Edwin,而不是“你必须使用Edwin”。感谢您的纠正。 - Isaac Rabinovitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接