2012-01-11 20 views
1

私は次のようにコードを生成したい:このコードを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をしたくありません! どうすればこの問題を回避できますか?

答えて

2

本当にコード生成が必要な作業をしていることは確かですか?あなたがこのようなことをすることができるので、あなたが私たちに示した例の中にはまだそれが必要です。ラケットで:

#lang racket 

;; When this file is required, dd will be provided to the outside. 
(provide dd) 

(define (foo str) 
    (map (lambda (x) (* 100 x)) (hash-ref dd str))) 

(define dd (make-hash (list (cons "L" (list 1 2 3))))) 
(hash-set! dd "H" (foo "L")) 

これは、他のプログラムで使用することができるモジュールあります。 Racketのモジュールは、が提供された項目以外のすべてを隠します。です。

なぜコード生成のアプローチをしたいのか説明できれば、そのことがわかりやすくわかります。コードを生成するには、s式を生成してファイルに書き込むよりも、マクロアプローチが効果的です。たとえば、http://docs.racket-lang.org/guide/macros.htmlを参照してください。

+0

はい、私はインタープリタを書いています。私はコードを変換し、すべての変換パスに対してS式で新しいコードを生成する必要があります(そのため、実行するファイルにs式を書きます)。私はマクロ的なアプローチを取っていますが、これも '提供する 'もありませんが、あなたの答えに感謝します。 –

+0

あなたはもっと悲しみを抱く危険がありますが、ファイルに書き込む必要があることは(私にとってはとにかく)はっきりしていません。私はあなたが通訳を書いていることを理解しており、ユーザコードを取ってそれを操作する必要があります。しかし、それを直接操作して評価することから、評価することができない理由はありません。私はもっ​​と詳細がおそらくここに必要だと思っています.... –

+0

@JohnClements私は言語をAからs式に変換し、変換が意味論的に同等であることを確認したいと思います。変換されたコードをファイルに追加して実行し、その結果を言語Aの実行結果と比較します。最後に、各フレーズの結果をファイルではなくコードでパイプライン処理します。 –

関連する問題