SICP 読むための設定とか

春休みなのでプログラミングを勉強しようと思い,SICPを読んでいます(取り敢えず三章までやる予定).以下は SICP のサンプルコードに使われている Scheme の処理系(Gauche)をインストールをした際のメモです.

Gauche のインストール

homebrew の pull request に上がっていた Gauche 用 formula を少しゴニョゴニョしてインストール(参考: Formula Cookbook).SLIB モジュールの trace がデバッグに便利なようなので,Gauche:FAQ - SLIBは使えますか 等を参考に SLIB もインストール.

Emacs の設定

gosh-mode

最初は scheme-complete, quack, gauche-mode を使っていたんですが,物足りなかったので,今風な感じの gosh-mode をインストール.

% make install

して,どこかに

(require 'gosh-config)

と書いておく.これでよしなにやってくれるはずだけど,うちの環境だと,auto-complete-mode が上手く動いてくれなかったので(make install が上手くいってない?),一旦,gosh-mode.elc を捨てて Emacs 起動後に

M-x byte-compile-file RET /path/to/gosh-mode.el RET

として,gosh-mode.elc を作りなおしてみると上手くいきました.
init file は以下のように設定.

(require 'gosh-config)
(setq gosh-mode-hook nil)
(setq gosh-inferior-mode-hook nil)
(defun my-gosh-mode-initialize ()
  (set (make-local-variable 'eldoc-idle-delay) 1.2)
  (turn-on-eldoc-mode))
(add-hook 'gosh-mode-hook 'my-gosh-mode-initialize)
(add-hook 'gosh-inferior-mode-hook 'my-gosh-mode-initialize)
(set-face-foreground 'gosh-modeline-normal-face "gold")

gosh-config をロードすると,(gosh-sticky-mode 1) となって自動で flymake をオンにするのだけれど,自分の scheme レベルではバッファが真っ赤に染まって大変なことになるので,hook を再定義して flymake を使わないようにしました.それと,eldoc で呼び出す関数 gosh-eldoc-print-current-symbol-info が重い感じがしたので,eldoc-idle-delay の値を少し大きくしてます(デフォルトは 0.2).
以上で,M-x gosh-run で REPL が使えたり C-x C-e が出来たりと,かなりいい感じになったので,先に挙げた三つの拡張はやめて,今は gosh-mode だけ使ってます.

info

SICP はどこかで拾った pdf 形式のものを読んでいるんですが,info 形式のものもあると便利なのでインストールしておきます.僕の場合,追加の info file は ~/.emacs.d/share/info で管理しているので,こんな感じに書いています.

;;; info
;; For adding .info to the entry, run the following in your shell.
;; % sudo install-info /path/to/foo.info /path/to/dir
(let ((my-info-dir "~/.emacs.d/share/info")
      (info-path (getenv "INFOPATH")))
  (unless (string-match (concat "\\`" (regexp-quote my-info-dir)) info-path)
    (setenv "INFOPATH"
            (concat my-info-dir ":" info-path))))

(defun open-sicp (&optional other-window)
  (interactive "P")
  (info "sicp.info" (and other-window "*SICP*")))

あと,anything を使って gauche-refj.info を読めるように

(defun anything-info-scheme-at-point ()
  (interactive)
  (anything
   :sources '(
              ((info-index . "gauche-refj.info"))
              ;; ((info-index . "gauche-refe.info"))
              ((info-index . "sicp.info"))
              )
   :input (thing-at-point 'symbol)
   :buffer "*info scheme*"))

とかしてます.でもなんか文字化けしてるよ...

SICP を読む前に

独習 Scheme 三週間 とか読んでおくと,scheme の雰囲気がつかめるかも.