2013年4月21日日曜日

[SICP][Lisp]Gauche + Emacsで環境構築

今更だけど、SICP (Structure and Interpreter Computer Programming)を読み始めた。
この本では、Schemeが使われている。
自分でコードを書きながら、読み進めた方が楽しいので、
まずは、Scheme処理系の一つであるGauche+Emacsを使い、
REPLとコード補完できる環境を構築した。

OSはUbuntu、Emacsは自分でインストールしたEmacs 24.2を使用している。

Gaucheのインストール

gaucheはパッケージが用意されているのでapt-getでインストールする。
$ apt-get install gauche

quackとscheme-completeのインストール

パッケージのダウンロード

インストール先は ~/.emacs.d/gauche-el とした。
$ cd ~/.emacs.d/
$ mkdir gauche-el
$ cd gauche-el
$ curl -O http://www.neilvandyke.org/quack/quack.el
$ curl -O http://synthcode.com/emacs/scheme-complete-0.8.11.el.gz
$ gunzip scheme-complete-0.8.11.el.gz
$ mv scheme-complete-0.8.11.el scheme-complete.el

init.elの設定

emacsの設定ファイルinit.elにquackとscheme-completeの設定を追加する。
(add-to-path 'load-path "~/.emacs.d/gauche-el")
(setq quack-default-program "gosh")
(require 'quack)
(require 'scheme-complete)
;;(autoload 'scheme-smart-complete "scheme-complete" nil t)
;; auto-completeを使っているので不要
;; (eval-after-load 'scheme
;;   '(define-key scheme-mode-map "\e\t" 'scheme-smart-complete))
(add-hook 'scheme-mode-hook
  (lambda ()
    (make-local-variable 'eldoc-documentation-function)
    (setq eldoc-documentation-function 'scheme-get-current-symbol-info)
    (eldoc-mode)))
(setq lisp-indent-function 'scheme-smart-indent-function)

動作確認

Emacsを起動後、hello.scm を新規作成する。
(print "こんにちは、世界!")

hello.scmのバッファでC-c C-lを押下する。
mini-bufferで、以下を聞かれる。
それぞれデフォルトのままで良い。
Load Scheme file: (default hello.scm) ~/workspace/sicp/
Run Scheme (default "gosh"):

REPLが開き、hello.scmの実行を結果が表示される。


gosh> こんにちは、世界!
#t
gosh>


とりあえず、他に、以下のコマンドが分かればOK。
  • C-c C-e S式を評価する。
  • M-x run-scheme REPLを起動する。

eldocで関数の説明が表示されるし、コード補完もできる。
いつも使っているslimeとあまり違和感はないようで、なかなか便利だ。


参考

quack
http://www.neilvandyke.org/quack/

scheme-complete
http://synthcode.com/wiki/scheme-complete

auto-complete
http://cx4a.org/software/auto-complete/index.ja.html

SCIPのmobiファイル
https://github.com/twcamper/sicp-kindle