私は次のようにコードを生成したい:このコードをRacket/Schemeでどのように生成できますか?
(define (foo str)
(map (lambda (x) (* 100 x)) (hash-ref dd str)))
(define sth `(begin
(define dd (make-hash (list (cons "L" (list 1 2 3)))))
(hash-set! dd "H" ,(foo "L"))
dd))
(私はsth.rkt
ファイルにsth
を書いて、それを実行します)
しかし、これはfoo
のために理由コードには、機能しません。生成されたコードにある識別子dd
を参照するため、まだ存在しません!
は、私は、このようなコードを生成することができる方法があります:
(define sth `(begin
(define dd (make-hash (list (cons "L" (list 1 2 3)))))
(hash-set! dd "H" (foo "L"))))
と機能foo
を付加、私は本当に私の最終的なファイルであることfoo
をしたくありません! どうすればこの問題を回避できますか?
はい、私はインタープリタを書いています。私はコードを変換し、すべての変換パスに対してS式で新しいコードを生成する必要があります(そのため、実行するファイルにs式を書きます)。私はマクロ的なアプローチを取っていますが、これも '提供する 'もありませんが、あなたの答えに感謝します。 –
あなたはもっと悲しみを抱く危険がありますが、ファイルに書き込む必要があることは(私にとってはとにかく)はっきりしていません。私はあなたが通訳を書いていることを理解しており、ユーザコードを取ってそれを操作する必要があります。しかし、それを直接操作して評価することから、評価することができない理由はありません。私はもっと詳細がおそらくここに必要だと思っています.... –
@JohnClements私は言語をAからs式に変換し、変換が意味論的に同等であることを確認したいと思います。変換されたコードをファイルに追加して実行し、その結果を言語Aの実行結果と比較します。最後に、各フレーズの結果をファイルではなくコードでパイプライン処理します。 –