Posted 2015-07-25 15:05:24 GMT
今回は、1990年代のLispとエディタについてですが、AIの冬が到来し、ばたばたとLispベンダーが斃れて行く90年代です。
1980年代には、IDEの先駆けであるLispマシン環境と共に開発環境が進化したという感じですが、80年代後半から90年代初頭には、ワークステーションが普及し、Unix上のCommon Lisp処理系も出てきます。
大抵は、Symbolicsの環境を再現するようなものが多いのですが、LucidやFranzを始めとして、当時普及してきたGNU Emacsに独自のGUIツールを組み合わせた製品が多いようです。
LucidがC++のIDEのエディタとして(GNU) Emacsを採用したという話は有名ですが、Lucid CLの開発環境も、4.0辺りからLucid Emacs+ILISP+Lucid CLという感じになったようです。
LucidはこのEmacsと処理系の組み合わせにGUIのツールを加えて、XLTというIDEを販売していた様子。
使ってみた感じでは、あまり洗練された感じはありませんが、クラスブラウザやパッケージを切り換える謎のツールなどもあるので、色々面白くはあります。
仕組みとしては、GUIツールとEmacsが通信して連携します。
LucidのXLTと似たようなもの、というかAllegro Composerの方がちょっと先行するようですが、類似のものにAllegro Composerがあります。
これは、最新のAllegro CLでも利用できますが、現行の2.0が出たのが、1996年位のようなので、ほぼ遺跡化しているような気もします。
XLTは、Lucid Emacs(XEmacs)+ILISPという感じでしたが、Allegro Composerは、Emacs(XEmacs)+ELIという構成で、同じくGUIツールとEmacsは通信して連携します。
上のLucid CLの話でも書きましたが、ILISPは、1990年辺りに登場し、Emacs上でCommon Lispを利用する際には広く使われたようです。
主な機能としては、
等々です。
SLIMEがメジャーになる前は、主にILISPが使われていたようですが、2005年辺りにはSLIMEの方が多く使われるようになり、現在使っている人はあまりいないようです。
下記の画像は、Allegro CL 4.3とILISPを組み合せてみた例で、大体1996年位の環境の再現ですが、シンボル名の補完なども快適に行なえます。
Symbolicsを意識したTypeoutウィンドウがポップアウトして来ますが、ILISP内のドキュメントを眺めると、どうも当時は好みが分かれていたようでOFFにして使った方が良いようなことも書いてあります。
シンボル名の補完は初期のILISPの1990年辺りからサポートしているようなのですが、どうもこの時期には定番機能だったようで、m-v-b
をmultiple-value-bind
に展開するような方式の補完も既にサポートされているようです。
1990年代当時のMacOSはGUI操作がメインでUnixのごっちゃごちゃなUIに比べて操作感も統一されていますが、MCLも統一感があります。
MCLは、処理系内からMacOSの機能をフルに使えたようですが、OS/UI両面での統一感があり、かなり操作していて気持ちが良いです。
MCLもHemlock由来のEmacsが標準のエディタですが、CLのオブジェクト指向機能を活用して書かれているようです。
この辺りもCommon Lisp的にエディタを拡張できて小気味良いですし、なんといってもエディタのカスタマイズも同じ言語でできる統一感というのは良いです。
下記は、適当にスクラッチファイルを生成して開くような簡単な例ですが、こういうのがCommon Lisp的に簡単に書けます。
#||
本当はsuperキーが使いたいが割り当てがないようなのでまあm-g n/lでもいいか
||#
(defvar *goto-comtab* (make-comtab))
(comtab-set-key *comtab* '(:meta #\g) *goto-comtab*)
(comtab-set-key *goto-comtab* #\l 'ed-open-g-file)
(comtab-set-key *goto-comtab* #\n 'ed-open-next-g-file)
(comtab-set-key *goto-comtab* #\p 'ed-open-previous-g-file)
(deftype gnum ()
'(integer 1 *))
(defun the-newest-file (dir)
(let ((newest (first
(sort
(mapcar #'(lambda (f)
(parse-integer (pathname-name f) :start 1))
dir)
#'>))))
(check-type newest gnum)
(make-pathname :defaults "unix:a:"
:name (format nil "g~6,'0D" newest)
:type "lisp")))
;; ~
(defmethod ed-open-g-file ((view fred-mixin))
(declare (ignore view))
(ed (the-newest-file (directory "Unix:a:g*.lisp"))))
(defun ensure-g-file (file)
(or (probe-file file)
(with-open-file (in file :if-does-not-exist :create)
(declare (ignore in))))
file)
(defmethod ed-open-next-g-file ((view fred-mixin))
(let ((file (slot-value view 'ccl::my-file-name)))
(ed (ensure-g-file (compute-next-g-file-name file)))
))
(defmethod ed-open-previous-g-file ((view fred-mixin))
(let ((file (slot-value view 'ccl::my-file-name)))
(ed (ensure-g-file (compute-previous-g-file-name file)))
))
(defun compute-next-g-file-name (g-file)
(let* ((name (pathname-name g-file))
(num (1+ (parse-integer name :start 1))))
(check-type num gnum)
(make-pathname :defaults "unix:a:"
:name (format nil "g~6,'0D" num)
:type "lisp")))
(defun compute-previous-g-file-name (g-file)
(let* ((name (pathname-name g-file))
(num (1- (parse-integer name :start 1))))
(check-type num gnum)
(make-pathname :defaults "unix:a:"
:name (format nil "g~6,'0D" num)
:type "lisp")))
;; *EOF*
他、GUIをメインにしたIDEを販売していたベンダーとしては、HarlequinのLispWorksがあるようです。
これは紆余曲折あって現在のLispWorksに繋がります。
Windows 3.1あたりからPCの利用が増え始め、Windows 95のブレイクによって一気にPCが普及しますが、LispベンダーもWindowsに力を入れ始めます。
当時のWindowsプラットフォームでは、UnixのようにエディタにはGNU Emacsを使ってしまえ、ということもできなかった為かGUIのIDEが登場してきます。
操作感としては、Emacsっぽくもできますが、デフォルトではPC操作に馴れ親しんだ人向けという感じです。
Allegro CL 5.0のWindows版あたりでは、当時流行っていたRADツール的な面が強調されているようにも見えます。
かなりごちゃごちゃとした1990年代ですが、SymbolicsなどのLispマシンで培ってきた文化は、Unixワークステーションのようないまいち統合されていない環境では上手く継承されず、部品ごとにバラバラにしたものを、エディタ+処理系のように組み合せて使うという現在主流の使い方に落ち着いてしまったようです。
そんな流れの中ではMCLがかなり良い感じでOS/GUIに統合されていたように思えます。
Norvig先生が、2001年に開発環境のレビューをしていますが、この中でもMCLはベストのIDEと評価されています。
これを読んだ時には、本当かいなと思っていましたが、実際試してみると、確かにSymbolicsの環境に匹敵する統一感はあるように思います。
しかし、その後MacがMacOSXに移行した位の時期にはMCL開発も鈍っていてCarbon対応したものの継ぎ接ぎ感があり、Digitoolも最終版のMCL 5.2を2007年にオープンソース化して開発もストップしてしまいます。
次回は、ほぼ現在と同じ2000年代で最後にしたいと思います。といってもあまり書くことがない気がしますが…。
■
HTML generated by 3bmd in LispWorks 7.0.0