局所変数定義

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と言う構文には、ここでは明らかになっていない、面白い仕組みがあるのではないか、と言う気がしてきた(のは気のせいか。。。)。