ラケットマクロを書く文脈では、「3D構文」は何を意味していますか?「3D構文」とは何ですか?
私はこのフレーズを数回聞いたことがあります。一度はマクロを参照して、私はと書いていました。しかしそれはしばらく前です。私はそれを修正し、今は私が間違ってやっていたものを覚えていません。
また、3Dの構文は常にが悪いですか?または、それはeval
のようなものです(あなたがそれを使用する必要があると思われる場合はおそらく間違っていますが、有効な使用方法があります)
ラケットマクロを書く文脈では、「3D構文」は何を意味していますか?「3D構文」とは何ですか?
私はこのフレーズを数回聞いたことがあります。一度はマクロを参照して、私はと書いていました。しかしそれはしばらく前です。私はそれを修正し、今は私が間違ってやっていたものを覚えていません。
また、3Dの構文は常にが悪いですか?または、それはeval
のようなものです(あなたがそれを使用する必要があると思われる場合はおそらく間違っていますが、有効な使用方法があります)
構文オブジェクトは、通常、わずかserializable dataとします。 3D構文はこの状態を弱める。それは、単純なデータだけではなく、任意の値に潜入することを可能にする。これが「3d」になっています。それらは、構文オブジェクトから期待される通常のフラットなものよりも上にある値です。
たとえば、lambda
の値を知らせることができます。これを行う
#lang racket
(define ns (make-base-namespace))
(define (set-next! n)
(parameterize ([current-namespace ns])
(eval #`(define next #,n)))) ;; <-- 3d-syntax here
(define (compute s)
(parameterize ([current-namespace ns])
(eval s)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define counter 0)
(set-next! (lambda()
(set! counter (add1 counter))
counter))
(compute '(+ (next)
(next)
(next)
(next)))
このような値の存在は、おそらくコンパイルの段階を介して情報を漏洩する病気設立試みを意味するので、通常は悪いことです。その結果、個別にコンパイルできない可能性があります。あなたのようなものに聞こえるエラーが表示された場合:
write: cannot marshal value that is embedded in compiled code value
を、その原因は、バイトコードにシリアライズすることはできません3D-構文の作品を制作したマクロに最も可能性が高いです。
まれに、時には動的な評価コンテキストで、しばしば3d構文が必要になることがあります。具体的な例として、DrRacketのデバッガでは、関数のアプリケーションがデバッガの関数に直接コールバックするようにプログラムの構文を注釈して、プログラムエディタでインタラクティブなコードカバレッジの色付けを行うことができます。その意味で、3d-syntaxは、動的に評価されるコードとその周囲環境との間の通信チャネルとして機能することができる。
そのような文脈でも、それは関数を注入する方がきれいだと思われますモジュールレベルの依存関係として、何とかしています。ええと、ステッパーは3d構文で流行っています。 –
合意。しかし、私は奇妙な問題に遭遇しました:http://lists.racket-lang.org/dev/archive/2013-April/012126.html、残念ながら私はこれらの日に何かを把握する時間がありません正確に私は行方不明です。 – dyoo
まず、お返事ありがとうございます!私は読んで、思考し、あなたの答えを手掛けようとしています。 1つは、答えはシンタックストランスフォーマーについて話すことになりますが、評価とネームスペースを使用していると思います。その意味を考えようとしています。また、私は、あなたの例では名前空間の使用に混乱したり混乱したりしています。それが必須かどうか、どうすればいいのかを理解しようとしています。 [This](https://gist.github.com/greghendershott/5923364)は簡単です。それは同じ答えを与える:10.それは同等かどうか? –
将来的には、すべてが十分に文書化されるでしょう! +1の難易度。私には良い賞金の質問のように見えます。私が適切に見つけることができる唯一のことは、このディスカッションでした:http://lists.racket-lang.org/dev/archive/2013-January/011637.html – jdero