LoginSignup
2
1

More than 5 years have passed since last update.

Allegro Common Lisp の excl パッケージをチラ見する

Last updated at Posted at 2013-12-10

これは、 Lisp Advent Calendar 2013 の記事の一つとして書かれました。


ストーリー

  1. Allegro Common Lisp でしっかり動作するLispコードがあった。
  2. なんとなく、Armed Bear Common Lisp で動くかどうか試した。
  3. あれ、エラーが出る
  4. あらら、気づかない内に、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*

一番びっくりしたのがこれ。ifthenelse, elseif といったものを導入し、cond よりも括弧の少ない多方向分岐構文を実現しています。また、 thenret という、「条件が真だったらとにかくその値を返す」なんてものも含まれてます。

defadvice と fwrapper

emacs lisp にもある defadvice と、改良版の def-fwrapper 。Common Lisp なら、 defmethod された関数に対してはそうとう融通がきくのですが、普通の defun された関数に対してはそうはいきません。 結局、安易に setf をぶち込んだりするのですが。。。これからはこっちを使おうかと。

まとめ

Allegro Common Lisp は、 そのドキュメントの目次が90項目以上 あったりします。その入り口をちらっと覗いてみただけのお粗末な記事ですが、なかなか面白いものを見つけられたなと思ってます。

余談

Allegro Common Lisp には、80年代のオブジェクトシステムである Flavors も、含まれているみたいです。
ちょっと面白そう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1