首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP:用Emacs和Geiser评估球拍进入REPL

SICP:用Emacs和Geiser评估球拍进入REPL
EN

Stack Overflow用户
提问于 2022-10-23 08:46:20
回答 1查看 105关注 0票数 1

通过使用Emacs、Geiser和MIT方案的SICP,我决定切换到球拍,以便正确地完成2.2.4节中涉及图片语言的练习。

配置

我使用以下~/.emacs配置为MIT和Racket提供了一个可以工作的设置:

代码语言:javascript
复制
(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缓冲区,在该缓冲区中,无法计算像这样的表达式。

代码语言:javascript
复制
  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的示例

当我使用上面的球拍工作流运行以下代码时,正确地显示了爱因斯坦的图片:

代码语言:javascript
复制
#lang sicp
(#%require sicp-pict)
(paint einstein)

所以我的设置没有完全破坏…

附录

在重新安装了geiser-racket包之后,我现在能够启动REPL了。我还可以使用C-c C-b评估整个缓冲区,该缓冲区将=> #<void>打印到屏幕底部。

但是,当我试图实际调用一个函数时,我会得到以下错误:

代码语言:javascript
复制
  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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-31 18:22:49

为了完成这一任务,我只需发布我为使所有事情都运行所采取的步骤:

使用melpa instaed of melpa-stable (~/emacs):

代码语言:javascript
复制
(require 'package)
(add-to-list 'package-archives
         '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

重新打开Emacs后刷新包:

代码语言:javascript
复制
M-x package-refresh-contents

安装racket-mode

代码语言:javascript
复制
M-x package-install RET racket-mode

安装软件包geiser-racket

代码语言:javascript
复制
M-x package-install RET geiser-racket

扩展您的Geiser配置(~/emacs):

代码语言:javascript
复制
(setq geiser-mit-binary "/usr/bin/scheme")
(setq geiser-racket-binary "/usr/bin/racket")
(setq geiser-active-implementations '(mit racket))

开始使用图片语言:

代码语言:javascript
复制
#lang sicp
(#%require sicp-pict)
(paint einstein)

用Emacs打开它:

代码语言:javascript
复制
emacs ../examples/einstein.rkt

启动一个球拍REPL并评估整个缓冲区:

代码语言:javascript
复制
C-c C-z
C-x o
C-c C-b

爱因斯坦的形象应该出现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74169756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档