Erlang感想
まだ本当にざっとしかみていませんが、KL1あたりと比較しての感想。
- 見た目はすげー似ている
appendとかreverseの定義を見ると、懐かしくて涙が出るよ:-) (Commited-Choice言語であるところのStrandからの影響もあるらしいので当然かもしれんが。)
複数のclauseで分岐するような場合、ピリオドで切るんじゃなくて、セミコロンで続けるところが違うけど。
あと、もちろん関数があって値が返せるところは大きな違い。
ただ、意味的にずいぶん違う点として、
- 未束縛の変数が使えない
例えば、
append([H|L1],L2) -> T = append(L1,L2), [H|T]; append([],L) -> L.
はOKだけど、
append([H|L1],L2) -> X = [H|T], T = append(L1,L2), X; append([],L) -> L.
はX = [H|T]の時点でTが未束縛なのでアウト。まぁ、普通の言語のセンスならそんなもんか、という感じだけど。
KL1やFlengは、値を返してもらうためには引数の変数に値を入れてもらわないといけないので、未束縛の変数が使えないということはあり得ない。でも、これによって、変数を誰が束縛するのか見た目では分からないという問題を起こして、じゃあ静的に解析するか(モード推論)とかめんどくさいことになったので、Erlangの選択はそれはそれで良いのかも知れない。
でも、未束縛の変数が使えないことによって、使えなくなるテクニックもあるはずなんだが…
あと、当然の帰結としてアクティブユニフィケーションは無い(のかな?)。右辺に未束縛の変数が出て来れないので。
[1,A] = [B,2]
は右辺のBが未束縛なので駄目。
あとは、
- spawnでプロセスを生成
というところは違う。これはもうちょっと調べないと。