Working through SICP using Emacs, Geiser, and MIT Scheme, I decided to switch over to Racket in order to properly do the exercises in section 2.2.4 involving the Picture Language.
Configuration
I got a setup together that works for MIT Scheme and Racket using the following ~/.emacs configuration:
(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))
Workflow with MIT Scheme
Here's my workflow for working with MIT Scheme:
First, I open a file (fib.scm) using emacs fib.scm. I'm asked to pick the Scheme implementation, which I answer with mit.
Second, I write my fib function, press C-c C-z to open a REPL.
Third, I switch back to the code buffer with C-x o and evaluate it using C-c C-b.
Fourth, I switch to the REPL buffer with C-x o and evaluate some expressions.
This it how it looks like:
Workflow with Racket
Here's my (intended) workflow for working with the SICP language of Racket:
First, I open a file (fib.rkt) using emacs fib.rkt. Interestingly, I'm not asked to pick a Scheme implementation.
Second, I write my fib function, but use #lang sicp in the first line. Then I open the REPL using C-c C-z.
Third, I switch back to the code buffer with C-x o and evaluate it using C-c C-b, which gives no error message, but prints => #<void> at the very bottom.
Fourth, I switch back to the REPL buffer with C-x o, where I fail to evaluate an expression like (fib 3):
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
This it how it looks like:
What am I doing wrong? Is it the configuration, is it the way I use it?
Example with sicp-pict
When I run the following code using the Racket workflow from above, the picture of Einstein is properly displayed:
#lang sicp
(#%require sicp-pict)
(paint einstein)
So my setup is not entirely broken…
Addendum
Having re-installed the geiser-racket package, I'm now able to start a REPL. I'm also able to evaluate the entire buffer using C-c C-b, which prints => #<void> to the bottom of the screen.
However, when I try to actually invoke a function, I get this error:
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
Edit: Oh dear, it was a simple syntax error... my bad! Everything is fine now!




To finish things up, I just post the steps I have taken to get everything to run:
Use
melpainstaed ofmelpa-stable(~/emacs):Refresh the packages after re-opening Emacs:
Install
racket-mode:Install the package
geiser-racket:Extend your Geiser config (
~/emacs):Start using the picture language:
Open it in Emacs:
Start a Racket REPL and evaluate the whole buffer:
An image of Einstein should appear.