Posted 2008-03-05 10:20:00 GMT
ポール・グレアム氏のコア言語としてのArcについての最近のエッセイで、condの括弧の多さへの批判と、これを放置していたのは、既存の価値観に捕われていた所為じゃなかろうか?のような指摘があったのですが、いやいや、condや、ifも色々面白い変遷があったようだし、そうでもないんじゃないか?、と思ったので、適当に纏めてみました。
もちろんpgはそういうことが言いたいんじゃない!ということになろうかと思いますが、私は、プログラミングに興味はあまり無く、言語の歴史や変遷に興味があるので :)
まず私のスタンスですが、condの括弧は多いとは感じません。R6RS風の角括弧も読み難く感じます。この辺は全く感覚的なものだと思うので、どうしようもないですね。特に理由もないですし。
ということで、Arcのifはcondより読み難いと思っていて、cond万歳な価値観であり、下記にもそういうバイアスがかかっていると思います。
それはさておき、cond、ifの歴史的変遷を眺めてみたいと思います。
[a[B;C] → prog2[d[E;F];g[H;I]; j[K;L] → (M N O); T → prog2[p[Q;R];s[T;U]]まず一番最初は、M式ですが、別にcondという名前もifという名前も付いていなくて、[]で纏められた条件式の集まりです。条件が真ならば、→の右側が評価されます。式はセミコロンで区切られます。
[(a b c) → (prog2 (d e f) (g h i)) (j k l) → '(m n o) 'T → (prog (p q r) (s t u))]という感じです。つまりM式は既にR6RS風であり、また、pgが問題にしている括弧の多さ問題もなかった訳ですね。まあ、代わりに矢印があるわけなのですが。
;; S式 (cond ((a b c) (prog2 (d e f) (g h i))) ((j k l) (quote (m n o))) ((quote t) (prog2 (p q r) (s t u))))となります。condの実行節が暗黙のprognになっているかどうか不明なのですが、自分がエミュレータ試しても、論文を眺めても暗黙のprognになっているという記載は見当たりません、また、省略されるとnilが返るということもなく、省略できません。この辺本当はどうだったんでしょう。pg氏は、暗黙のprognだった、って書いてるんですけども…。M式でも暗黙のprognってどう表現して良いか分からないし謎です。
(if (a b c) (progn (d e f) (g h i)) (if (j k l) '(m n o) (p q r) (s t u)))CONDがあるので、こういう書き方はされないのですが、敢えて書くとこうなります。
(defmacro if (pred then &rest else) `(cond (,pred ,then) (t ,@else)))のようなcondに展開されるマクロになっているので、おまけでそうしてるんじゃないかと思ったりします。
(IF (A B C) (BLOCK (D E F) (G H I)) (if (J K L) '(M N O) (BLOCK (P Q R) (S T U))))これまた、若干無理矢理な書き方で、こういう時は素直にCONDを使うようです。
(if (a b c) (d e f) (g h i) else (if (j k l) '(m n o) else (p q r) (s t u)))これは、Multics Emacsの中のifマクロの例。
(if (a b c) then (d e f) (g h i) elseif (j k l) '(m n o) else (p q r) (s t u))これは、Franz Lispのifマクロの例。Franz Lispの処理系のソースでは、condが殆ど使われておらず、殆どこのifマクロです。
(cond [(a b c) (prog2 (d e f) (g h i))] [(j k l) '(m n o)] ['T (prog2 (p q r) (s t u))])
(if (a b c) then (d e f) (g h i) else (if (j k l) then '(m n o) else (p q r) (s t u)))のように書けるようになりました。thenとelseのキーワードがあり、どっちの節も暗黙のprognです。
(if (a b c) (progn (d e f) (g h i)) (if (j k l) '(m n o) (progn (p q r) (s t u))))
(if (a b c) (do (d e f) (g h i)) (j k l) '(m n o) (do (p q r) (s t u)))という風にcond、ifにも色々あったようなのです。