SchemeのletとJSの即時関数実行パターンって同じだよね

こんにちは. この前, 部屋の掃除中, Schemeの本をみつけて,パラパラ読んでいました. 読んでいて気づいたんですけど, SchemeのletとJSの即時関数実行パターンって同じですよね?

JSで

(function (a, b) {
  return a*a + b*b;
})(3, 4);

とか書くじゃないですか? 即時関数実行パターンを使ったやつ

これってSchemeだと

((lambda (a b) (+ (* a a) (* b b))) 3 4)

になるんだよね. lambdaの仮引数a, bの有効な範囲がlambda本体の中に限定されている状態. いわゆるローカル変数. でも, ローカル変数を使うのにいちいちlambdaって書くのは面倒だよね・・・ そこでletの出番.

letを使うと

(let ((a 3)
      (b 4))
  (+ (* a a) (* b b)))

こんなふうに書ける.

JSは「ブラウザで動くSchemeをコンセプトにして作られたらしいけど, たしかに似ているなーと感じる部分はたくさんある. スコープもそうだし, 関数がファーストオブジェクトであったり, クロージャなどなど. こんなかんじで互いの似ているところ, 違うところを探していくのも面白い.

そういや, JSにもletってあったな...(使ったことないけど)