OCaml
いろいろやる気は起こらないが、簡単そうなものならば読めそうなので、OCaml入門とか読む。
http://www.fos.kuis.kyoto-u.ac.jp/~t-sekiym/classes/isle4/mltext/ocaml.html
「関数適用と評価戦略」を読んで、初めて、
- 値呼び (Call by Value)
- 名前呼び (Call by Name)
- 必要呼び (Call by Need)
の違いを知った。
ほいで、OCaml自体は、値呼びでええんかいな?どこにも書いてないようだが・・・
というより副作用を持つ言語で、名前呼びするって、Cのマクロアンチパターンだし、ありえないのか。
#include <stdio.h> #define SQUARE(x) ((x) * (x)) int main() { int x = 1; int ret = SQUARE(++x); printf("%d\n", x); // => 3 printf("%d\n", ret); // => 9 return 0; }
あれ?
retは
2 * 3 = 6
になると思ったのに、
9になるな。なんでや (gcc 4.8.3)
Cの ++演算子は、インクリメントした結果を返すものじゃなくて、インクリメントして変数の値を変えた後の変数の値を参照してるものと考えれば辻褄があうのかな。