Emacs Lispに導入されなかったRMSの嫌いな機能
RMSは主張が非常に一貫していて、Lispのデザインについても40年以上一貫した主張をしている。
1980年前後のLispの処理系作成者向けのメーリングリストや、Common Lispの仕様策定メーリングリストでの議論での主張も全くぶれがない。
GNU Emacs(Emacs Lisp)が登場する前からRMSにはLisp哲学があるのだが、RMSとEmacs Lispのデザインの話をすると、何故かGNU Emacs初期のコンピュータリソースの制限のせいで〜○○機能を諦めざるを得なかったんです、という話に持っていかれてしまう。
私が言いたいのは、RMSの好みは非常に一貫していて、コンピュータリソースが多かろうと少なかろうと嫌いなものは一切入っていないということなのだ。
こういうRMSの好き嫌いをまとめていたが、まとめて管理するのが面倒なので、好き嫌いをみつける都度Common Lispの上に機能を実装してみることにした。
Emacs LispとCommon Lispで仕様が違う場合に追い掛けてみると何らかのこだわりがあることが多い。
format嫌い
elispにもformat
はあるじゃないかとなりそうだが、MIT Lispマシン〜Common Lispのformat
の話。
RMSはよりLispyな代替ライブラリとしてoutput
というのを提案している。
(output nil
(onum 42 10 5 :pad-char #\0))
;=> "00042"
equal vs eql
代表的なところでは、比較述語の命名規則がある。RMSは、MACLISP以来の伝統である、member
(フルスペル)はequal
(フルスペル)を使い、eq
ならmemq
とするような命名規則が好みであった。しかしCommon Lispでは、member
でeql
をデフォルトで使う。
ということで、elispではRMS好みの仕様になっている。
ほか、目立つところを数点列挙してみる
ifのelse節がprogn
Common Lispではelse節はprognでない。
MIT Lispマシンでも実装して賛否両論。後期ではCommon Lispの仕様になった。
Common Lispでもインデントだけelisp風にするという謎の愛好者がいる。
#| |#
範囲コメントは嫌い
Common Lispのような範囲コメントは嫌い。エディタで支援すればいい。
elispには採用されていない。
&keyword嫌い
初期のelispでは最低限のサポートに留まっている。最近ではCommon Lisp拡張があるが、拡張という位置付け。
拡張されたsetfやletが好き
elispでもCommon Lispでも実装されていない。
Lispマシンでは全部ではないが大抵のアイデアは実装された。
分配束縛付きのlet
から発展してmultiple-value-bind
の代りに(LET (((VALUES A B C) m-v-returning-form)) ...)
とする、setf
を色々な場所に適用する(setf `(,a ,b ,c) (list 0 1 2))
など。
内部関数定義が嫌い
labels
や、flet
が嫌い。
elispでは拡張扱い。cl-flet
、cl-labels
なお、近年では、RMSのパッケージ嫌いで度々論争になっているが、パッケージが嫌いという過去の議論をみつけることはできていない。
ただ初期Common Lispの仕様策定や、Lispマシン上でのCommon Lisp実装に関っていたRMSが、Common Lisp利用者からも不満が多いパッケージ仕様を嫌っていてもおかしくはない。