Common lispの開発環境

動機

  • 遺伝的プログラミングの勉強をしているとLispの例が多いから.人工知能系の研究で従来から使われている理由(Cに比べての高級性)は最近の言語には劣るから意味ないと言われてもいるようだけど,少し本を読んだ限りでは高級性以外の関数型であること,さらにプログラムがデータであることによる自己増殖に可能性を感じたから.
  • 世の中のすごいプログラマの多くが良いと言うんだからそこには何かあるんだろうという期待.

環境構築

  • 色々と処理系があるけど,フリーだとClispSBCLかClozureというのが良く使われるようだ.コンパイルまでしてくれるSBCLを使うことにする.また,環境はSlimeというのがEmacsで使えるようなのでそれを使う.gemに相当するものとしてquicklispというのがあるようなのでそれも入れる.初回にSBCLを起動してquciklispをインストールしてInitファイルに書き込んでおく.
$ sudo apt-get install sbcl slime cl-quicklisp # インストール
$ sbcl # SBCLを起動して初期設定
* (load "/usr/share/cl-quicklisp/quicklisp.lisp")
* (quicklisp-quickstart:install)
* (ql:add-to-init-file)
* (ql:update-all-dists) ; 定期的にリポジトリをアップデートする
  • 補完もしてほしいので、slime-companyを入れる。Cask(MELPA)から入るので簡単。設定も下記を.emacsに書くだけ。
(slime-setup '(slime-fancy slime-company)

Emacsの設定ファイルに下記を追記

(setq slime-net-coding-system 'utf-8-unix)
; common-lisp system setting, SBCL:sbcl, Clozure:ccl, clisp:
(setq inferior-lisp-program "sbcl")
(setq load-path (cons (expand-file-name "/usr/share/emacs/site-lisp/slime") load-path))
(require 'slime-autoloads)
(slime-setup '(slime-repl slime-fancy slime-banner slime-company))

Hyperspec

w3mで見れるようにすること,ローカルのファイルを参照するようにすること. - UbuntuだとHyperspecはapt-getで入る.MacならLispworksからTarを落としてくる. - apt-getでw3m, w3m-elを入れておく. - 下記をinit.elに記載.

(require 'w3m)
(setq browse-url-browser-function #'w3m-browse-url)
;(global-set-key (kbd "C-c h") 'hyperspec-lookup)
(setq common-lisp-hyperspec-root
      (concat "file://" (expand-file-name "/usr/share/doc/hyperspec/"))
      common-lisp-hyperspec-symbol-table
      (expand-file-name "/usr/share/doc/hyperspec/Data/Map_Sym.txt"))

開発手順

  1. Emacsを起動してSlimeを起動.M-x slime.
  2. Lispファイルを編集.
  3. 関数の上でC-c C-cで関数定義をSlimeに送る.
  4. C-c C-zでSlimeバッファに飛ぶ.
  5. REPL上で動作確認をする.
  6. 関数が正しく動作するまで2に戻る.

他に開発中に便利なコマンドは下記.

C-c C-c: 関数のコンパイル
C-M-x  : 現在のトップレベル関数の評価
C-c C-k: バッファ全体をコンパイル
C-c C-z: REPLに飛ぶ
C-c C-r: 領域の評価
C-x C-e: 直前のS式の評価 (C-xなので注意)
M-.   : シンボルの定義に飛ぶ
M-,   : ジャンプまでに戻る
M-p   : 前の履歴 (コンパイル情報の参照)
M-n   : 次の履歴
M-x slime-restart-inferior-lisp: REPLを再起動

slimeによるデバッグ

  • エラーが発生したら,”:”でslime-evalに入って任意の式をグローバル環境で評価できる.道標に"e"はフレーム内で評価できる.
  • "n"/"p"でフレームを降りたり上がったり.一番上の0番がスタックフレームのトップ(つまりそこでエラーが発生している).
  • "v"でフレームに対応するコードを表示.
  • "t"でローカル変数を表示.