2012-05-15 217 views
3

欲遍歷表示打嗝數據結構的載體樹:遍歷矢量樹

[:div {:class "special"} [:btn-grp '("Hello" "Hi")]] 

然後我想派遣於載體上的關鍵字,如果多重方法已爲關鍵字定義,然後它會返回另一組矢量,它將替換原始標記。

例如,上述結構會被變換爲:

[:div {:class "special"} [:div [:button "Hello"] [:button "Hi"]]] 

定製多重方法將收到列表(「你好」,「喜」)作爲參數。它會返回包含按鈕的div。

我如何寫穿越載體與形式作爲參數一切分派的關鍵字,然後返回的形式代替當前形式的功能?

回答

1
(ns customtags 
    (:require [clojure.walk :as walk])) 

(def customtags (atom {})) 

(defn add-custom-tag [tag f] 
    (swap! customtags assoc tag f)) 

(defn try-transform [[tag & params :as coll]] 
    (if-let [f (get @customtags tag)] 
    (apply f params) 
    coll)) 

(defmacro defcustomtag [tag params & body] 
    `(add-custom-tag ~tag (fn ~params [email protected]))) 

(defn apply-custom-tags [coll] 
    (walk/prewalk 
    (fn [x] 
     (if (vector? x) 
     (try-transform x) 
     x)) coll)) 

使用它:

(require '[customtags :as ct]) 
(ct/defcustomtag :btn-grp [& coll] (into [:div] (map (fn [x] [:button x]) coll))) 
(ct/defcustomtag :button [name] [:input {:type "button" :id name}]) 

(def data [:div {:class "special"} [:btn-grp "Hello" "Hi"]]) 

(ct/apply-custom-tags data) 
[:div {:class "special"} [:div [:input {:type "button", :id "Hello"}] [:input {:type "button", :id "Hi"}]]] 
+0

丹妮,感謝您的答覆。然而,爲什麼你說把整棵樹表示爲一個數據結構是沒有價值的。打嗝會爲表格帶來價值,因爲您可以將HTML樹作爲矢量樹來操作,如果自定義標籤也可以同樣呈現,它會有幫助嗎?我本着學習的精神問這個問題,所以請讓我知道你的意見。 – murtaza52

+0

我明白你的觀點。更新我的回覆。 – DanLebrero

+0

感謝偉大的代碼! – murtaza52