2

私は現在、すばらしいEnliveをテンプレート エンジンとして使用して小さな CMS を開発しています。Enlive にはat、HTML スニペットを指定するノード (マップ) と、それぞれがセレクター (ベクトル) と変換 (クロージャー) で構成される任意の数のタプルを取る、というマクロがあります。

(at a-node
  [:a :selector] a-transformation
  [:another :selector] another-transformation
  ...)

ここで、受信データ/コンテキストに応じてタプルを生成したいと考えています。私は成功せずに多くの異なることを試みました。例えば

(let [this (repository/u "http://example.com/ACMECorp")
      statements (repository/find-by-subject this)
      context {:depth 1}]
  `(at (snippet-for 'this 'context)
       [root] (set-attr :about (str 'this))
       ~@(loop [rules []
                st statements]
           (if-not (seq st)
             rules
             (recur (conj rules
                          `[:> (attr= :property ~(str (repository/predicate (first st))))]
                          `(content (renderit ~(repository/object (first st)) 'context)))
                    (rest st))))))

どんな助けでも大歓迎です。

-ヨッヘン

4

2 に答える 2

1

それらが交換可能かどうかはわかりませんが、at*関数を見てください。あなたの問題はマクロであることにあるように私には思えます。

編集:そうではありません。このように呼んでください:

(at* a-node
  [[:a :selector] a-transformation
   [:another :selector] another-transformation
   ...])
于 2011-07-23T21:21:52.390 に答える
1

Clojure は Lisp であるため、いつでもリストとして必要なコードをビルドして呼び出すevalことができます。evalあなたが提供したコードについて 100% 確信があるわけではありませんが、構文引用符全体を呼び出しで囲みたいだけだと思います。

(let [this (repository/u "http://example.com/ACMECorp")
      statements (repository/find-by-subject this)
      context {:depth 1}]
  (eval `(at (snippet-for 'this 'context)
             [root] (set-attr :about (str 'this))
             ~@(loop [rules []
                      st statements]
                 (if-not (seq st)
                   rules
                   (recur (conj rules
                                `[:> (attr= :property ~(str (repository/predicate (first st))))]
                                `(content (renderit ~(repository/object (first st)) 'context)))
                          (rest st)))))))
于 2011-07-24T13:02:08.060 に答える