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 の雰囲気がつかめるかも.