職場で、Scheme を使用して構成スクリプトを実装しようとしたときに、基本的な問題に遭遇しました。人為的で制限された言語を発明する必要を避けるために、スクリプトには実際のコードが含まれている必要があります。このコードは後で評価されます。構成を希望どおりに機能させるには、特定の変数にアクセスできる必要があります。これらの変数は、評価のコンテキストでのみ認識されます。したがって、構成スクリプトは現在の環境で評価する必要があります。これが私が話していることの原始的な例です:
(let ((a #t))
(wr "a is ..."
(eval '(if a "true" "false"))))
このコードを実行すると、変数「a」が不明であるというエラー メッセージが常に表示されます。問題は、現在の環境内で凍結されたコードを評価する方法を知っていますか?
PS: bigloo コンパイラを使用しています。
///////////////////////////////////////////// 編集: /// /////////////////////////////////////////////// /
Chris によって提案されたアプローチを使用すると、もう 1 つの興味深い問題、case キーワードの使用法に行き着きました。次の 2 つの例はどちらも、"yes!" の出力をトリガーする同じケース構造を使用しています。ライン。残念ながら、それらは異なる動作をします。
通常 -> 出力は「yes!」予想通り:
(define testit "test")
(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
eval -> を使用すると、出力は驚くほど「いいえ」になります。
(define env (null-environment 5))
(eval '(define testit "test") env)
(eval '(case testit
(("test")
(begin (newline) (write "yes!") (newline)))
(else
(begin (newline) (write "no!") (newline)))))
それは意味がありますか?