Scheme では eval でローカル変数にアクセス出来ない。
(let ((a 'local)) (eval 'a (interaction-environment))) ;; => ERROR: unbound variable: a
更に R6RS では interaction-environment さえ廃止されて評価環境を細かく制御しなければならないように (出来るように) なっている。
一方、 JavaScript の eval はローカル変数にアクセス出来るようだ。
function hoge(x) { var a="local"; return eval(x); } hoge("a"); // => "local"
JavaScript は最適化が難しいと聞いたことがあるが、こんな仕様があったのではそりゃそうだろうと納得した。
安全性を意識してのことか、最近の仕様では eval で新しい変数を宣言することは出来ないようになっているとのことだ。 変態的なリフレクションこそが JavaScript の面白いところだと思うのだが、今のように広く使われるようになるとそうも言ってられないんだろう。 ちょっと残念な気はする。
Document ID: 27683bd02007fe735e2475edc9f2ce70