Common Lispのお宅拝見: Allegro Common Lisp篇 — #:g1

Posted 2017-05-09 06:00:20 GMT

今回は、Allegro Common Lisp 10.1のcl-userを眺める。
Allegro CLもLispWorksと同様に様々なプラットフォームで稼動しIDEも付属するが、LispWorksと違ってGUI環境のパッケージは別になっていて、CUIの時は通常読み込まれない。
とりあえず、cl-userの中身を確認してみると、

(package-use-list :cl-user)
→ (#<The COMMON-LISP package> #<The EXCL package>) 

となっている。
GUI環境では、cl-userではなく、cg-userがホームパッケージとなり、cgパッケージがこれに加わる。

このexclパッケージがかなり大きく、シンボル数735、そのうち関数513、変数53というごった煮ユーティリティパッケージとなっている。

defpackage時でオプションを省略した場合のデフォルトでは、clしかuseされず、割合に素直な印象。
とはいえ、結局処理系ごとにまちまちなので、(:use :cl)と明示的に書くことになるのだが。

(defpackage :foo)
→ #<The FOO package>

(package-use-list :foo)(#<The COMMON-LISP package>)

ちなみに、exclいうのはExtended Common Lispの略で、Allegro CLの元の名前である。
Allegro CLは、Tektronix 44xxシリーズで稼動するCommon Lisp処理系(TEK CL)として誕生したが、Franzの内部的には、Extended CLとしていたらしい。

その後、Macintoshで稼動するCoral CLをFranzが共同で販売した際に、Macintosh Allegro Common Lispとし、その後、既存のExCLもAllegro CLと名称が変更になった。

閑話休題。Allegro CLのcl-userパッケージの特徴だが、正規表現ライブラリがデフォルトの状態で使えたりすることだろうか。

(re-let "(.*)\\s+(.*)\\s+(.*)" "foo bar baz"
        ((x 3) (y 1) (z 2))
  (list x y z))

("baz" "foo" "bar")

正規表現がデフォルトのcl-userで使える処理系というのは案外少ない。筆者が知る限りというか唯一かもしれない(CLISPもそうかと思ったがregexpパッケージはuseされていないようだ)。

その他は、LispWorksと同じくCLtL1時代からのユーティリティが多数定義してある。
ここ数年マルチスレッド対応が徹底してきた為、exclパッケージはさらに肥大したようだ。

また、今回も非常にどうでも良い所ではあるが、ユーティリティに定義されていることが多いtruefalseを調べてみたが、意外にもエクスポートされていなかった。
筆者が定番と思っていただけだったかもしれない……。

(mapcar #'excl::true (loop :repeat 20 :for i :from 1 :collect i))(t t t t t t t t t t t t t t t t t t t t) 
(mapcar #'excl::false (loop :repeat 20 :for i :from 1 :collect i))(nil nil nil nil nil nil nil nil nil nil) 

結び

Allegro CLの‘excl’のように処理系独自のユーティリティパッケージは非常に面白く、詳細に眺めてみたい所なのだが膨大できりがない。
なんとかコンパクトにまとめられると良いのだが……。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus