Динамический код с clojure - PullRequest
       11

Динамический код с clojure

3 голосов
/ 08 февраля 2011

Я пытаюсь создать динамический код в 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 ~ `, чтобы попытаться заставить его работать,и сейчас я в замешательстве.Любое руководство приветствуется.

Спасибо,

Колин

Ответы [ 2 ]

5 голосов
/ 08 февраля 2011

Вам не нужен динамически генерируемый код для этого.Изменение анонимной функции на #(every? (fn [k] (= (% k) (rec k))) keys) должно делать то, что вы хотите, без генерации кода во время выполнения.

Возможность использовать функции более высокого порядка означает, что вам вряд ли когда-нибудь потребуется динамически генерировать код.

3 голосов
/ 08 февраля 2011

Вы можете использовать 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...