2011-02-08 9 views
3

私はclojure内でいくつかの動的コードを作成しようとしています。以下の関数では、(と)マクロの条件が動的に生成されるという考え方です。動的コードとクローズ

(defn matching-keys [rec match-feed keys] 
    (> (count (clojure.set/select #(and (for [k keys] 
             (= (% k) (rec k)))) 
           (set match-feed))) 
    0)) 

その後、このコードは生産(と)[:tag :attrs]のこの渡されたキーのようなものでしょう:

(and (= (% :tag) (rec :tag)) 
    (= (% :attrs) (rec :attrs))) 

私はそれを動作させるためにしようとする様々な`` and〜 `演算子をいじり、及び状態になっていますしてきました混乱のどんな指導も歓迎です。

おかげで、

コリン・

答えて

5

しかし、動的な環境を使用することも可能です。匿名関数を#(every? (fn [k] (= (% k) (rec k))) keys)に変更すると、実行時にコードを生成せずに必要な処理を行う必要があります。

高次関数を使用できるため、コードを動的に生成する必要はほとんどありません。

+0

ブライアンに感謝します。私はちょっとしたことがある:#(いくつかの真実?(kキー)(=(%k)(rec k)))))しかし、あなたの解決策はより良い。乾杯。 – colinf

3

あなたは例えば、動的に構築されたフォームを評価するためににevalを使用することができます。

(eval '(= 2 3)) 

動的に評価フォームがアクセス全くないことに留意してくださいレキシカルコンテキストつまり、次のことを意味します。

(let [a 1 b 2] 
    (eval '(+ a b))) 

は機能しません。あなたはこのために、動的に生成されたコードを必要としない

(def a nil) 
(def b nil) 

(binding [a 1 b 2] 
    (eval '(+ a b))) 
+0

+1とevalとの動的対語結合についての洞察...私はそれを知らなかった! – mikera

関連する問題