3

私はxml構造で親ノードのIDを与えるこの関数を持っています。

(ns foo.core
  (:require [clojure.data.zip.xml :as cdzx]))

(defn id-of-parent [zipper child-id node1 node2 node3 node4]
  (cdzx/xml-> zipper node1 node2 node3 node4
    (cdzx/attr= :Id child-id) zip/up zip/up (cdzx/attr :Id)))

それは次のように呼ばれます

(id-of-parent zipper child-id :Foos :Foo :Bars :Bar)

4 つの「ノード」を単純な「& パス」に置き換えて、この関数をより一般的なものにして、任意の数のノードを使用してパスを設定できるようにします。

(defn id-of-parent [zipper child-id & path]
  (cdzx/xml-> zipper ????path????
    (cdzx/attr= :Id child-id) zip/up zip/up (cdzx/attr :Id)))

一連のキーワードを単一のキーワードに展開する適切な方法は何ですか?

4

3 に答える 3

4

syntax-quote 関数のunquote-splicing 機能は、ほとんどの場合、マクロで関数呼び出しを作成する際に使用されますが、一般的な関数呼び出しの作成には適しています。

(defn id-of-parent [zipper child-id & path]
        (apply cdzx/xml-> `(~zipper ~@path
          ~(cdzx/attr= :Id child-id) ~zip/up ~zip/up ~(cdzx/attr :Id))))

xml->はマクロではなく関数であるため、 applyを使用して呼び出しを作成できます。

于 2012-08-02T20:57:37.127 に答える
1

使用できますapply

(defn id-of-parent
  [zipper child-id & path]
  (->> [(cdzx/attr= :Id child-id) zip/up zip/up (cdzx/attr :Id)]
    (concat path)
    (apply cdzx/xml-> zipper)))
于 2012-08-03T06:21:36.990 に答える
1

Apply は次のように使用できます。

(defn id-of-parent
  [zipper child-id & path]
  (let [pred [path (cdzx/attr= :Id child-id) zip/up zip/up (cdzx/attr :Id)]]
    (apply cdzx/xml-> zipper (flatten pred))))
于 2012-08-03T06:32:01.817 に答える