アカウント名:
パスワード:
ヨタですが、ラクダをPerlに奪われて悔しい思いをしてるんではないかと邪推してます(笑)。ここ [caml.org]を見ても、やはりラクダだし。
それはさておき、「強い型の関数型言語でMLのお仲間」だそうですから、系譜としてはLisp系ってことになるのかな?(よくわかってない)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
まじめな話 (スコア:1)
元ネタのリンクを見てみたけれど、英語がよーわからんので いまいちピンと来ません。
# っつう人が多いから『おもしろおかしい』ネタばかり増えるんだろうけど。
誰か「こんな感じ」っての、教えてよ。
Re:まじめな話 (スコア:2, 参考になる)
ヨタですが、ラクダをPerlに奪われて悔しい思いをしてるんではないかと邪推してます(笑)。ここ [caml.org]を見ても、やはりラクダだし。
それはさておき、「強い型の関数型言語でMLのお仲間」だそうですから、系譜としてはLisp系ってことになるのかな?(よくわかってない)
Re:まじめな話 (スコア:1)
つまり、あらゆる変数、関数の型を言語処理系が押えているので、ありがちでしかも意外と見付かりにくい、型の誤りによるバグをコード実行前(構文解析直後)に検出する、というのが一番の強みではないかと。
#でも、これはMLの特徴で、camlがそこからどんだけ進化しているかチェックしてないっす。
#一つにはオブジェクト指向対応なんだと思いますが。
あ、ちなみに言語としての特徴はLispの系譜を引いていますが、Lispみたいにカッコまみれの構文じゃないです。
#あれはあれで嫌いじゃないですけど。
Re:まじめな話 (スコア:1)
Re:まじめな話 (スコア:2, 参考になる)
直和型について、何がよいのかを C と比較して例だけ書いてみます。「x+y」のような「数式」を扱うプログラムを書いているとして、型 expr を
type expr = Const of int | Var of string | Plus of expr * expr | Times of expr * expr
のように定義しておくと、 Const(100) とか Plus(Var("x"), Var("y")) とかが expr 型の値として使えるようになります。
C で同じようなことをするなら、
struct expr {
int tag; /* 0:Const, 1:Var, 2:Plus, 3:Times */
union {
int cnst; /* tag==0 のとき有効 */
char *var; /* tag==1 のとき有効 */
struct { /* tag==2 || tag==3 のとき有効 */
expr *x;
expr *y;
} operands;
};
};
のようになるでしょう。 tag の値が0以上3以下であることや、 tag の値と他のフィールドの使いかたが合っていることは、プログラマが注意していなければなりません。
とくに、この型の値を受け取って処理するとき、 C では switch 文を使って書くことになると思いますが、そうして書かれたプログラムを読む際は、「この switch 文は本当にすべての場合を処理しているのだろうか?」ということを人間が意識しながら読まなければならず、負担がかかります。
このようなとき、 Caml ではパターンマッチ(match 式)という構文を使って書きます。すべての場合を処理しないパターンマッチは普通使わないので、コンパイラが警告を出してくれます。そのため、警告が出ないよう行儀よく書かれたプログラムを読む際、パターンマッチですべての場合が尽くされていない可能性を心配する必要がありません。
直和型だけだと「Pascal でいいじゃん」と言われるかもしれませんが、 Caml はほかにもいろいろ素晴らしいです。高階関数の扱いが簡単なのもいいです。
鵜呑みにしてみる?