[OK]を内部に具体化の一環として形をしましょう以下のように見えるScript
プロトコルのインスタンスであることを:ダイナミックは、のまっすぐこれを取得してみましょうマクロ
(defprotocol Script
(run [this model]))
アイデアはdefscript
への最初の引数はmodel
に対応キーにバインドする必要のあるシンボルのリストであるということで
(.run (defscript [a b] (println a)) {:a 1}) ;; yields 1
model
パラメータを使用しようとすると、マクロ展開時に、それはただの記号だから、私は常に、ハンガーノックてるように私は、効果的にこのような効果を生み出すことができます任意のコードを考え出すことはできません。
(defmacro invoke-
[params model body]
(let [p (flatten (map (fn [x] [x (model (keyword x))]) params))]
`(let [[email protected]]
~body)))
(defmacro defscript
[params & body]
`(reify Script
(run [~'this ~'model]
(invoke- ~params ~'model [email protected]))))
invoke-
直接呼び出す場合は正常に動作します:
(invoke- [a] {:a 1} (println a)) ;; prints 1
しかし
model
として
defscript
内で使用されるとき、それは動作しませんが正しく展開することができません。
(.run (defscript [a] (println a)) {:a 1}) ;; prints nil
どうすればこのポイントを超えて一緒に接着することができますか?それは基本的に、あなたの引数ベクトルが結合非構造のショートカットであると思われ
「clojure.template」で提供されている機能とぼんやりとしているようです。 –