0

職場で、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))))) 

それは意味がありますか?

4

2 に答える 2

5

evalを使用して定義されたようなレキシカル変数にアクセスできませんlet

代わりに、環境を作成し、使用可能にする変数を設定する必要があります。例えば:

(define env (null-environment 5))
(eval '(define a #t) env)
(wr "a is ..."
    (eval '(if a "true" "false") env))
于 2011-04-26T12:21:03.260 に答える
2

編集に答えるために、 env を引数として最後の eval に渡しません。その引数が指定されていない場合、eval が作成する環境に testit は存在​​しません。

それはタイプミスかもしれませんが、そうでない場合は、それが問題です。

于 2011-05-03T16:29:17.157 に答える