2014-06-18 69 views
1

我想使用tinsel HTML template library刪除節點,如果用戶是零,但我很難搞清楚如何評估條件,因爲一切都基於宏。檢查基於clojure /金屬箔模板宏參數的條件

此版本不起作用,因爲它在編譯期間將user評估爲'user表單,因爲它不是零,所以難以設置真正的分支,也不會重新評估。 (如果這不是很正確,請隨意糾正我的術語)。

(tc/deftemplate folder-list 
    (tc/html-document (slurp "resources/templates/folders.html")) 
    [user] 
    (tc/id= :mnuUsers) 
    (fn [node] (do (prn 'user) (if 'user node nil)))) 

下面是我得到的最接近,這事實上確實打印在渲染時,而不是編譯時的用戶,並正確分支機構,但拋出一個錯誤,說無法解析符號node

(tc/deftemplate folder-list 
    (tc/html-document (slurp "resources/templates/folders.html")) 
    [user] 
    (tc/id= :mnuUsers) 
    (fn [node] '(do (prn user) (if user node nil)))) 

回答

1

我從來沒有使用金屬絲,但我會在黑暗中拍攝...這是否工作?

(t/deftemplate folder-list 
    [[:h1#mnuUsers "header"]] 
    [user] 
    (t/id= :mnuUsers) 
    (fn [node] 
     (list 'if 'user node nil))) 

我通常的做法是使用語法引號和不加引號。但是,我無法讓它工作。上面從符號列表中構建了一個表達式......它看起來很醜陋,但它可能會訣竅。

編輯

版本使用的語法引用來代替:

(t/deftemplate folder-list2 
    [[:h1#mnuUsers "header"]] 
    [user] 
    (t/id= :mnuUsers) 
    (fn [node] 
    `(if ~'user ~node nil))) 
+0

作品!是否可以創建一個宏'hide-if',這樣我就可以使用'(hide-if(nil?user))'作爲最後一種形式? –

+1

明白了:''(defmacro hide-if [b](fn [node]'(if〜b nil〜node)))''。如有可能,請隨意簡化或生成。 –

+0

奇怪的是,*工作*(在repl中),但沒有*編譯*(使用'lein compile'),這對我來說似乎沒有任何意義,儘管如此。以下編譯也是如此。 ''(defmacro hide-if [b](let [b#b]'(fn [node#](list'if(quote〜b#)nil node#))))''。 –