これは、 Lisp Advent Calendar 2013 の記事の一つとして書かれました。
ストーリー
- Allegro Common Lisp でしっかり動作するLispコードがあった。
- なんとなく、Armed Bear Common Lisp で動くかどうか試した。
- あれ、エラーが出る
- あらら、気づかない内に、Allegro Common Lisp 専用の excl パッケージ を使ってたのか。
ということがあり、このexclパッケージの存在が気になっていました。今回は、その内容をざっと見て、「へーそんなのあるのかー」と思ったものをちょっと紹介してみようと思っております。
どんなものが入っているのか
excl パッケージは、ANSI Common Lisp に対する Allegro 固有の拡張で、固有のパッケージに含まれないものが収められているようです。以下のようなものが入っています。
- stream 拡張 :: いわゆる gray stream など
- 国際化 :: ストリームに対する external-format 指定の詳細や、localeなど
- コンパイラ :: コンパイラに対する詳細な指定や、FASLの扱いなど
- OSとのインターフェース :: ファイル操作や、シグナルハンドリングなど
- 同期機構 :: アトミック操作や、ロックなど
- 正規表現
- GC :: GCの起動や、オブジェクトへの ファイナライザの登録 など
ほか、 exit なども excl パッケージの内容です。
気になった便利(?)オペレータ
while, until
その名の通り、与えた条件が真/偽である間、指定した処理を実行し続けるというもの。先に書いた、「Allegro Common Lisp から別処理系への移植」でうっかり使ってしまっていたのがこれでした。 loop
マクロで十分なのですが、平易に書けるのでつい使ってしまっていたのかも。
prefixp
第一引数のシーケンスが、第二引数のシーケンスのプリフィックスになってるかどうかを見る。ときどきこういうものを loop
を駆使して手書きしている気がします。
if*
一番びっくりしたのがこれ。if
に then
や else
, elseif
といったものを導入し、cond
よりも括弧の少ない多方向分岐構文を実現しています。また、 thenret
という、「条件が真だったらとにかくその値を返す」なんてものも含まれてます。
defadvice と fwrapper
emacs lisp にもある defadvice
と、改良版の def-fwrapper
。Common Lisp なら、 defmethod
された関数に対してはそうとう融通がきくのですが、普通の defun
された関数に対してはそうはいきません。 結局、安易に setf
をぶち込んだりするのですが。。。これからはこっちを使おうかと。
まとめ
Allegro Common Lisp は、 そのドキュメントの目次が90項目以上 あったりします。その入り口をちらっと覗いてみただけのお粗末な記事ですが、なかなか面白いものを見つけられたなと思ってます。
余談
Allegro Common Lisp には、80年代のオブジェクトシステムである Flavors も、含まれているみたいです。
ちょっと面白そう。