Closed1

Emacs Lispに導入されなかったRMSの嫌いな機能

g000001g000001

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では、membereqlをデフォルトで使う。
ということで、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-fletcl-labels

なお、近年では、RMSのパッケージ嫌いで度々論争になっているが、パッケージが嫌いという過去の議論をみつけることはできていない。
ただ初期Common Lispの仕様策定や、Lispマシン上でのCommon Lisp実装に関っていたRMSが、Common Lisp利用者からも不満が多いパッケージ仕様を嫌っていてもおかしくはない。

このスクラップは5ヶ月前にクローズされました