#:g1: ifのelse部が可変長

Posted 2021-06-29 20:10:21 GMT

先日redditで、MACLISPの子孫でifのelse部が可変長なのを受け継いだのがEmacs Lispだけなのは何故かという質問がありました。

諸説ありますが、私は、「RMSの趣味」説を提唱したいです。

MACLISP系Lispのifの由来

ただその前にまずMACLISPのifがMACLISP系方言にMACLISPから伝搬していったという前提がまず微妙で、ifの仕様がMACLISPに由来するという前提がはっきりしなさそうです。

意外にもMACLISP系方言での標準的なifが成立するのは比較的新しく1978年あたりになりますが、現在メジャーなCommon LispやSchemeifの形式以外にバリエーションが多数ありました。

この辺りの流れをみると同時多発的にMACLISP方言にifが導入された様子で、下記の1978年のMACLISPのメーリングリストの議論を眺めるにその形式も揺れていたことがわかります。

そんなelse部が可変長のif形式ですが、少なくともLisp Machine LispとMACLISPでは採用されていました。MACLISPの方はいつ実装されたのかは不明なのですがLisp Machine Lispの方は記録が残っており、1979-07-20にAGRE氏によりelse部を可変長にしたらどうかという提案があったのを受けて、

RMSが1979-07-22日にLisp Machine Lispに機能を実装したようです。

I made the extension to IF for multiple else-clauses.
There seems to be no need for an IF-NOT macro when
(IF (NOT ...) ...) will work just as well with only 2 more characters.

拡張と書いているので、Lisp Machine Lispでは、当初は、Common Lispと同じifの形式だった可能性もあります。しかしこの時期のLispマシンのソースコードが残っていないので詳細は分からず……。

そしてこの可変長のelse部のifですが、Lisp Machine Manualを眺めるに賛否両論があった様子。

Chinual 2では可変長だという説明はありませんが、Chinual 4では、else部が可変長であることと、その利用についてはプログラミングスタイルとして賛否があるという記述があり、Chinual 5で可変長についての記述はまた消えます。

ただし記述は消えるものの、Lisp Machine Lispとしてはifのelse部は可変長であり続けたようでSymbolicsのZetalisp等も受け継ぎました。

RMSの一貫性

さてここでRMSですが、RMSの発言等を古いメーリングリストで眺めていると、RMSのLispについての好みは非常に一貫していて、後に自身が実装したLisp処理系であるEmacs Lispの仕様と照らし合わせてみても、まったくぶれがありません。

この辺りを鑑みるにLispマシングループでifのelse部の可変長について議論あった際にはRMSは可変長else派であったのではないでしょうか。
そして自らのLisp実装には可変長elseのifを採用するのは自然なのでEmacs Lispのifもelse部が可変長、ということになったのではないでしょうか。

以上が私の「ifのelse部が可変長なのはRMSの趣味」説です。

まとめ

RMSのLispの好みの一貫性については、非常に面白いのでいつかまとめてみたいところです。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus