NILのマニュアル発見! — #:g1

Posted 2010-12-14 15:21:00 GMT

今日ふとしたきっかけから自分が長らく知りたいなと思っていたLISP方言のNILのマニュアルを発見することができました。
場所は、コンピュータ関係の貴重な資料を集めている、Computer History MusiumのSoftware Preservation Groupのページからなのですが、どうも最近公開されたようです。
-(http://www.softwarepreservation.org/projects/LISP/maclisp_family/#New_Implementation_of_Lisp_%28NIL%29,_S-1_Lisp_)
ざっとNILを紹介すると、NIL((ちなみに、YaleのScheme系方言のTはこれをもじったらしいです))は、New Implementation of Lispの略で、70年代後半から80年代前半にかけて、Lispマシンのような専用マシンではなく当時発表されたVAXのような廉価(専用マシンに比べ)な汎用マシンで動くLISPが求められていたのですが、そんなVAXをターゲットにMacLISP系の方言として実装が開始されました。
稼動することが期待されていた主なアプリケーションはMacsymaで、ターゲットユーザーもMacsymaのユーザーだったようですが、それ故、演算に強いことが求められていたようです。
そんなこんなで開発がスタートしたNILですが、82年位からCommon Lisp策定の動きが出てきます。
いままでネット上で入手できる資料では、Common Lispとの関係がいまいち不明だったのですが、このマニュアルを読む限り途中から、NILは、Common Lispの方言として開発が進められたようです。
このマニュアルが出た時期は、1983/2月〜1983/12月なのですが、Common Lispは1984年に仕様が固まったので、Common Lisp策定よりまえに方言があったということになるのが面白いところ。
KCLも1983年から開発がスタートしているようですし、Spice Lispも既に開発されているしで、仕様が出る前に色々な処理系があったようです。
方言というからには色々違ってくるところがあると思うのですが、1983年12月のマニュアルではほぼCommon Lispのスーパーセットになっているようです。
機能としては、Lispマシンのように、ユーザーが拡張可能なLOOPマクロ、FORMATに加え、オブジェクト指向システムとしては、Flavorsがあるという感じです。
STEVEというNILで書かれたEmacsがあったり、基本的になんでもユーザーが拡張できるようになっていてフリーダム。標準で妙な機能もあったりしてMITのハッカーテイストが溢れているなあと思いました。

ということで一人興奮しつつ、早速NILのマニュアルを眺めていたのですが、メモがわりにTwitterでつぶやいていたのでブログにまとめて置くことにしました。誰得ですが。
-g177564: livlisに冗談でNILについての本を登録しようとしたら、最近公開されてた! やった! software preservation group凄い! http://bit.ly/gGg6hI
-g177564: うーん、でも83年のマニュアル眺めるとNILはCLの方言ってことになってるなー。ちょっと残念
-g177564: でも、letが分配束縛に対応してたりはするな >nil
-g177564: LispM lispと同じく、macroもある様子。あと、progwがある。でも仕様がちょっと違う気がする。progwqとprogwfってなんだ。 >NIL
-g177564: LispMと同じくlexpr-funcallがある。dovectorというのがあった。doは古いスタイルもサポート。(do var init step endtest body)という形式 > NIL
-g177564: catchとthrowはCLと同じ形式で、古い形式は、*catchと*throwになっている様子。多分これはLispM lispと逆だと思う。values-vectorってのがある。NILではvectorを良く使うらしい。 >NIL
-g177564: multiple-valueという名前でmultiple-value-seqがあるLispM lispと同じ。get-propertiesというのはなんぞ。sortcar、memq、samepnamep、はMacLISPコンパチ >NIL
-g177564: (gensym 8)という仕様を初めて知った。へー。
-g177564: CLで定義されてない便利関数として、symbolconcとpackage-symbolconcがあった。(symbolconc 'foo '- 5)=> foo-5(多分) >NIL
-g177564: 伝統のadd1 sub1 greaterp timesがあった。 fixnum専用で +& *&などがある。double floatは、+$。vector専用にvref、make-vector。to-stringもある。
-g177564: hashtableで、string=とstring-equalが使える。パッケージの仕組みは独自のものを持っていたらしいが破棄されたみたい >NIL
-g177564: defstruct回りに変なものが沢山ある気がする。:predicateでマクロみたいな形式で関数が定義できる >NIL
-g177564: NILのLOOPはCLtL1の単純LOOPではなくて、LispMのLOOPが載っている様子。ANSI CLと違ってdefine-loop-sequence-pathによってユーザーが拡張可能。
-g177564: いや、loop pathを定義する最も汎用的なものは、define-loop-pathらしい。 >NIL
-g177564: formatもLispMと同じくANSI CLよりずっと魔窟。~\foo\で複数文字も受け付ける気でいたらしい。さらにフォーマット指示子をdefine-format-opでユーザーが拡張できる。
-g177564: allfilesでディレクトリ以下の全ファイルが取れる。mapallfilesというのもある。>NIL
-g177564: ;; -*-Mode:Lisp; -*- のようなものがファイルの属性としてファイルシステムの項目で定義してある。へー。 >NIL
-g177564: 19.8.7.2 RMS and Related Hacking なんぞこの章www >NIL
-g177564: なるほど、VMSにRMSというのがあったのか >NIL
-g177564: CGOLのreadtableが用意されているらしいw >NIL
-g177564: who-calls、whereisがある。describeのようなexhibitがある。これはオブジェクトを対話的に編集できるらしい >NIL
-g177564: timerというのがある。(timer #'cons 100 #(a b))でconsを百回実行するらしい。apply的だけどvectorも引数として指定できるらしい >NIL
-g177564: timeパッケージに便利そうなものが色々定義されているけど、time:moonphaseとか使うのだろうかw >NIL
-g177564: おお!、昔のMacLISPとかのファイルのヘッダに良く書かれているFM +2D.3H.29M.57S.とかいう文字は、月の満ち欠けについてだったのか。なんで記録してるんだろうw >NIL
-g177564: .@garaemon さらにtime:print-moonphaseでプリティプリントされた結果が印字できるようですw
-g177564: time:last-sunday-in-aprilと、time:last-sunday-in-octoberって何のためにあるの?w >NIL
-g177564: 23.5.8 Brain Damageという章があるw >NIL
-g177564: Emacs系のSTEVEっていうエディタが標準で付いてるらしい >NIL
-g177564: STEVEはNILで書かれたEmacsらしい。 >NIL
-g177564: Bolioモードがある。多分このマニュアルもbolioで書かれている気がする >NIL
-g177564: へー、LL modeというemacs のinteraction-modeみたいなのがある >NIL
-g177564: へー、c-m-w append-next-killとか始めて知った。こういう古いマニュアルを読んでEmacsのコマンドを発見することが多いw
-g177564: STEVEのコマンド名は、Zmacsみたいに、Foo Bar Baz形式ではなくてEmacs風にFoo-Bar-Bazらしい >NIL
-g177564: LispMのように、パッチ機構がある。load-patchesでパッチを読み込んで当てる。si:new-patch-systemでモジュールに対してのパッチを作成する模様 >NIL
-g177564: 述語の組み合わせを単純にするという機構がある様子。(and c d (or a b)) => (or (and a c d) (and b c d)) 便利なんだろうか >NIL
-g177564: Mini-MYCINというのがデモで付いてくる様子 >NIL
-g177564: VMSの機能により、si:defsyscallを使えば、BASIC、C、Pascal、PL/1、BLISS etcと連携できるらしい >NIL
-g177564: 命名規則は、CLと同じ様子。システムで定義済の変更しても良い変数は、*foo-bar-baz*、定数は、foo-bar-bazという解釈らしい >NIL
-g177564: やっと339ページ眺め終った >NIL CLの方言ということだけど、CLtLの決定は、1984年で、NILは1983年なのでCLは標準より先に方言があったということになるんだろうか。
-g177564: @seiji1976 なるほど、これは羨しい機構ですねー。VMSのCLである VAX LISPもVMSでは同じ感じだったようです。
-g177564: @garaemon ですねー、これ良くマクロ定義で使いますよね >symbolconc
-g177564: @komagata なるほど昔は結構ハッカー的にはポピュラーだったんですかね。パッケージはtimeパッケージにまとまっているのですが多分9割方ふざけてるんだと思いますw。ファイルを保存すると多分勝手に更新されるんですよね
-g177564: さっき眺めたNILのマニュアルより古いのを眺めたら真として、#tを定義していたらしい、NILと()も別物としていた様子。CLに合せてt nil = () にした様子。偽は、どうも#fではなくてnilっぽい
-g177564: 文字表現もディスパッチマクロ文字だけどNILは、#2\a とかでフォントの種類を変更できたのかw CLtL1もそうだったんだろうか

comments powered by Disqus