局所変数定義
OCamlの場合、大域環境で変数を束縛するのにもletを使う。
let x = 10;;
直接、x = 10とはならない("="は代入演算子ではなく、比較演算子のため)。letと言うと、lambdaのSyntax Sugarであると、SICPには書いてあるが、そのように解釈してしまうと、letで宣言すると大域環境ではなく、大域環境の下に新たにできる環境で束縛されてしまう気がする。
実際に、局所変数定義を行う時は、
let x = 10;; (* 大域環境で定義 *) let x = 20 in x + x;; (* 局所環境で定義 *)
と言うように、ほとんど同じ構文になってしまう。
この構文を見て、すごく違和感を覚えていたのだけど、ふと、"in"というキーワードがポイントなのではないか、と言う気がしてきた。"in"が入ることで、同じような構文定義だけど、この"x"と言う変数は、"in"の環境下でしか使えないよ、と言う意味。
大域環境で定義する場合は、"in"を省略しているわけだが、"in"を省略することで、大域環境下でboundingするよ〜、と言う意味合いになるのだろうか。
とすると、
let x = 10 in global;;
なんて意味があったりして。
何となく、OCamlでletと言う構文には、ここでは明らかになっていない、面白い仕組みがあるのではないか、と言う気がしてきた(のは気のせいか。。。)。