scheme コードバトン CL フォークメモ

Scheme コードバトンの CL fork について、詳しくないけど面白そうだ、やってみようか、という方向けに簡単にまとめてみます。何と言うかいろんな方が沢山ネタを仕込んでいるのが楽しいですね。現在バトンは http://gist.github.com/280060/ (NANRI さん)で、参加希望の方は http://practical-scheme.net/chaton/common-lisp-jp/ に行けばよいようです。

  • パッケージ。 hige の関数名 pon 、使う時には hige:pon となる訳ですね。これはフォーク直後から。以下、基本的に hige パッケージ内に関数が定義されています。Common Lisp ではパッケージは重要です。特筆すべきは、今のところ外部のライブラリを使っておらず、言語仕様で定義された関数だけを使っています。scheme が大量のライブラリ(srfi)を使っているのと対照的ですね。
  • #+ABCL。処理系によってプログラムを変えたい場合に使います。ここでは ABCL(Armed Bear Common Lisp) 環境でのみ jimport というマクロを定義しています。ABCL は JVM 上で動作する Common Lisp 処理系です。逆に#-ABCL と書いてあると直後のS式はABCL以外での定義になります。後ろの方では #+SBCL という SBCL 専用の定義も含まれています。scheme では cond-expand というので同じような処理系依存処理が書けるようです。
  • aif。アナフォリックマクロという奴です。書籍 On Lisp より。
  • nlet。こちらは書籍 Let Over Lambda より。私は Let Over Lambda を読んでいないのですが、素敵なマクロが沢山定義されているらしいです。これはscheme の named-let みたいなのを定義しています。マクロ定義中の(declare (optimize (speed 3))) というのが素敵ですね。最適化の指示です。
  • defstruct。構造体を定義します。定義の直後に説明文字列が入っています。構造体だけでなく関数定義の defun でももちろん説明文字列を含められます。この文字列はもちろん後から取り出せるので、Java Doc みたいなドキュメントが簡単に作れます。個人的には scheme はなんでこの機能が無いのか不思議です。
  • defclass。クラスを定義します。
  • defmethod。メソッドを定義します。print-object は表示するときの仕方を定義するものです。中で使っているのは悪名高い? loop マクロ。
  • format。数カ所で使われています。素敵なのは dump-dict での使われ方でしょうか。呪文的です。CL の format はもっと病的な機能も持っています。
  • 辞書データ。データをシンボルで持っていて、Common Lisp はシンボルはパッケージに属するので細かいケアがされています。シンボルじゃなくて文字列でもてば簡単、と思わなくはないのですが、きっと理由があるのです。
  • *query-io*, *debug-io* 。標準入出力だけじゃなくこんなのもちゃんと標準化されて仕様になっています。

大本の higepon さんのコードバトンまとめページはこちら。