通过使用Emacs、Geiser和MIT方案的SICP,我决定切换到球拍,以便正确地完成2.2.4节中涉及图片语言的练习。
配置
我使用以下~/.emacs配置为MIT和Racket提供了一个可以工作的设置:
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
(package-initialize)
(setq geiser-mit-binary "/usr/bin/scheme")
(setq geiser-racket-binary "/usr/bin/racket")
(setq geiser-active-implementations '(mit racket))
(add-to-list 'auto-mode-alist '("\\.rkt\\'" . geiser-mode))基于MIT方案的工作流
下面是我使用MIT计划的工作流程:
首先,我使用fib.scm打开一个文件( emacs fib.scm )。我被要求选择方案实现,我用mit来回答。
其次,我编写了我的fib函数,按C-c C-z键打开一个REPL。
第三,我用C-x o切换回代码缓冲区,并使用C-c C-b对其进行评估。
第四,我使用C-x o切换到REPL缓冲区,并计算一些表达式。
它看起来是这样的:

带球拍的工作流
下面是我的(预期的)工作流程,用于使用SICP语言的Racket:
首先,我使用fib.rkt打开一个文件( emacs fib.rkt )。令人感兴趣的是,并没有要求我选择一个方案实现。
其次,我编写了我的fib函数,但是在第一行中使用了#lang sicp。然后使用C-c C-z打开REPL。
第三,我用C-x o切换回代码缓冲区,并使用C-c C-b对其进行评估,这没有提供错误消息,但在最底层打印=> #<void>。
第四,我用C-x o,切换回REPL缓冲区,在该缓冲区中,无法计算像这样的表达式。
2 racket@> (fib 3)
3 fib: undefined;
4 cannot reference an identifier before its definition
5 in module: top-level
6 context...:
7 body of top-level
8 /usr/share/racket/collects/racket/repl.rkt:11:26它看起来是这样的:

我做错了什么?是配置,还是我使用它的方式?
使用sicp-pict的示例
当我使用上面的球拍工作流运行以下代码时,正确地显示了爱因斯坦的图片:
#lang sicp
(#%require sicp-pict)
(paint einstein)所以我的设置没有完全破坏…
附录
在重新安装了geiser-racket包之后,我现在能够启动REPL了。我还可以使用C-c C-b评估整个缓冲区,该缓冲区将=> #<void>打印到屏幕底部。
但是,当我试图实际调用一个函数时,我会得到以下错误:
1 Welcome to Racket v8.6 [cs].
2 racket@> (fib 3)
3 +: contract violation
4 expected: number?
5 given: #<procedure:fib>
6 context...:
7 /usr/share/racket/collects/racket/private/norm-define.rkt:52:83: body of top-level
8 /usr/share/racket/collects/racket/repl.rkt:11:26

编辑:哦,天哪,这是一个简单的语法错误.我的错!现在一切都好了!

发布于 2022-10-31 18:22:49
为了完成这一任务,我只需发布我为使所有事情都运行所采取的步骤:
使用melpa instaed of melpa-stable (~/emacs):
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
(package-initialize)重新打开Emacs后刷新包:
M-x package-refresh-contents安装racket-mode
M-x package-install RET racket-mode安装软件包geiser-racket
M-x package-install RET geiser-racket扩展您的Geiser配置(~/emacs):
(setq geiser-mit-binary "/usr/bin/scheme")
(setq geiser-racket-binary "/usr/bin/racket")
(setq geiser-active-implementations '(mit racket))开始使用图片语言:
#lang sicp
(#%require sicp-pict)
(paint einstein)用Emacs打开它:
emacs ../examples/einstein.rkt启动一个球拍REPL并评估整个缓冲区:
C-c C-z
C-x o
C-c C-b爱因斯坦的形象应该出现。
https://stackoverflow.com/questions/74169756
复制相似问题