R6RS スキームで現在の環境を取得し、それを 2 番目の引数として渡す方法はありますeval
か?
たとえば、次の式が 9 を返すには、どのような疑問符が必要ですか?
(let ((x 4)
(y 5))
(eval '(+ x y) ???))
R6RS スキームで現在の環境を取得し、それを 2 番目の引数として渡す方法はありますeval
か?
たとえば、次の式が 9 を返すには、どのような疑問符が必要ですか?
(let ((x 4)
(y 5))
(eval '(+ x y) ???))
いいえ、R6RSにはそのようなものはありません。いくつかのまれな実装はそのようなものをサポートするかもしれませんが、圧倒的多数(eval
他の言語を含む!)ではこれを行うことはできません。
その理由は単純です。ローカル名に基づいて2つの関数を区別できるようになるため、コンパイルが中断され、場合によっては単純な最適化が禁止されることもあります。たとえば、入力できるものがある場合、???
最適化できる場合でも、コンパイラには2つのバインディングが必要になります。可能であるまれなケースでは、???
(一部の言語では単なる使用法であるeval
)で使用されるものはすべて、既知のバインディングをそれらの値にマップする別のコンパイルをトリガーします。eval
(一部のブラウザーのJSコードで文字通り言及されていると、奇妙な動作が発生します。これは事実上同じ問題です。)
字句変数は、の観点からは環境の一部にはなりませんeval
。したがって、あなたの例では、字句変数とeval
に触れる方法はありません。x
y
更新:Guile 2.0.5以降、を使用できますlocal-eval
。これにより、eval式でローカル(字句)変数を使用できるようになります。しかし、Eliが言うように、ほとんどのScheme実装はこれをサポートしていません。