#:g1: Lispとエディタ (3)

Posted 2015-07-02 22:42:11 GMT

 前回1960年代のLispのエディタ環境を眺めてみましたが、今回から1970年代を眺めてみようと思います。 まず、前回に引き続き、BBN-LISPの環境ですが、1971/2年のBBN-LISPのマニュアルを眺めると、構造エディタはかなり増強されています。
詳しくは579頁まで記述が増えたマニュアルに書いてありますが、

主な所としては、

でしょうか。
他、数え切れない程、コマンドが追加されています。

1966年には検索はありませんでしたが、様々な方法で検索でき、検索してからの置換も可能になっています。
アンドゥ機能も以前は、保存したものを戻すだけでしたが、かなりユーザーインターフェースが強化されています。
文字列の編集はS式単位だとアトム一つになるため編集単位が大き過ぎる問題がありますが、リストに変換して再度文字列に戻すようなコマンドが追加されました。
編集機能が充実したため、コマンドをまとめて実行するというtecoedsedの系譜のような、編集素材とコマンド(これもS式)を別々に与えるというような使われ方も発達しています(応用例を後述)。

The Programmer's assistant

 エディタもかなりの増強がされていますが、他に目立つ機能として、The Programmer's assistantと呼ばれる一連の機能があります。

に詳細が述べられていますが、主にREPL(toplevel)の履歴機能とコマンド編集、DWIM機能を中心とした支援システムです。

LISPX

この履歴編集機能はLISPXと呼ばれるようですが、機能としては、

等々、Unixでいうとコマンドの履歴編集機能に相当します。
ちなみに、cshはINTERLISPの機能を真似したようなので、現在お馴染のUnixシェルの履歴機能の大元は、INTERLISP(BBN-LISP)ということになるようです。

Unixシェルと違うところといえば、LISP処理系がシェルになってしまっているということでしょうか。
また、cshはアンドゥ機能を取り込むことはなく後続のシェルでも該当する機能はありませんが、BBN-LISPでは、関数定義を取り消したり、

INTERLISP-10  31-Dec-84 ...
Hi.
3_defineq((foo(n)n)) ;fooを定義
=DEFINEQ
(foo)
4_undo ;定義を取消し
defineq undone.
5_(foo 8)

UNDEFINED CAR OF FORM ;定義されていないというエラー foo

6_redo 3 ;やり直し =DEFINEQ (foo) 7_(foo 8) 8 8_

変数に格納したリストを変更して、それを取り消したりすることが可能です。

INTERLISP-10  31-Dec-84 ...
Hi.
3_rpaqq(foo (0 1 2 3 4)) ; fooに '(0 1 2 3 4)というリストを代入
=RPAQQ
(0 1 2 3 4)
6_foo
(0 1 2 3 4)
7_(cdr foo)
=CDR
(1 2 3 4)
8_(rplaca foo 'a) ;carを'aに変更
=RPLACA
(a 1 2 3 4)
9_foo
(a 1 2 3 4)
10_undo 8 ;アンドゥ実行
rplaca undone.
11_foo
(0 1 2 3 4) ;元に戻った

また、FIXは、指定したコマンドを構造エディタで編集しますが、Unixシェルと違って非常に有用なものになっています。
Unixシェルだとエディタを呼び出してどうするんだろうなという感が強いですが、LISPXの場合は、プログラミング開発の最中なので有用度がかなり違っているという印象です。
さらにユーザーがLISPXのコマンドを定義して拡張することが可能です。

以上のように、プログラミング言語と環境がかなり混ざっている感もありますが、環境としてはかなり強力です。
現在人気のSLIME(Common Lisp開発環境)と比べてもBBN-LISPの方がインタラクティブな面は多々あります。

DWIM

DWIMは有名な機能ですが、スペル修正を含め、構文の間違いを訂正する機能です。
括弧の対応ミス等、打ち間違いを検出するとユーザーへの問い合わせが発生し、ユーザーの指示により訂正が実行されます。

BREAK PACKAGE

編集機能とはちょっと違ってデバッグ方面の発展です。 BREAK PACKAGEは、所謂breakなのですが、BBN-LISPが大元のようです。
デバッグ等で活躍しますが、breakしてからのエディタでの編集が構造エディタということもあり、かなり一体感があります。

PRINTSTRUCTURE

PRINTSTRUCTUREはプリティプリント系の方向の発展の気がしますが、呼出グラフを可視化する機能で、現在のCommon Lisp等でいうとwho-callsで知られる機能です。
関数を実行すると、プログラム全体の呼び出しグラフが表示され、全体の見取り図を提供します。

MAKEFILE

BBN-LISPはかなりファイル指向よりイメージ指向に近いものになってきていますが、メモリ上の定義をファイルに書き出す機能も充実しています。
整頓された書き出しにはMAKEFILEという関数を利用して、選択した関数をファイルにプリティプリントして出力します。

Super Parenthesis

細かい所ですが、超括弧も導入されています。
連続するコッカをまとめて']'で閉じることが可能。
[がある場合は、]は対応する[で閉じます。 プリティプリンタも超括弧を使って表示されるので、この方式がメジャーになっていれば「LISPは連続する)))がー」という話もなかったのかもしれません(まあ、どうも読み辛い気がしますが。)

TRANSOR

構造エディタは、S式sedとしても使えるように進化しましたが、この応用として異なるLISP方言のソースコードを変換するTRANSORという機能が実装されています。
個別の関数の変換の指定は、エディタのコマンド(S式)で記述します。
ちなみに、S式レベルで変換できないエスケープ文字などの違いは、prescanという関数で処理します。

まとめ

 以上、主にプログラムの編集機能を軸に1972年のBBN-LISPの環境を眺めてみました。 マニュアルを眺めてみると、スクリーン指向以前の行指向なターミナル環境としては、究極の最終形態に近いものではないかなと感じます。
現在、美麗な開発環境は多数あると思いますが、これ程の統一感もなかなか無いのではないでしょうか。
これらのアイデアと環境が半世紀近く前に存在したというのも凄い。

なかなかEmacsに辿きませんが、次回こそEmacsとLispの連携について書く予定です。


HTML generated by 3bmd in SBCL 1.2.13

comments powered by Disqus