Macros 根据clojure/tinsel模板宏中的参数检查条件

Macros 根据clojure/tinsel模板宏中的参数检查条件,macros,clojure,Macros,Clojure,如果用户为nil,我尝试使用删除节点,但我很难弄清楚如何计算条件,因为所有内容都基于宏 此版本不起作用,因为它在编译时将user计算为一个表单'user,该表单不是空的,因此硬设置真正的分支,并且从不重新计算。(如果我的术语不太正确,请随意更正) 这是我得到的最接近的一个,它实际上在渲染时而不是编译时打印用户,并正确地进行分支,但抛出一个错误,表示无法解析symbol节点 (tc/deftemplate folder-list (tc/html-document (slurp "resour

如果用户为nil,我尝试使用删除节点,但我很难弄清楚如何计算条件,因为所有内容都基于宏

此版本不起作用,因为它在编译时将
user
计算为一个表单
'user
,该表单不是空的,因此硬设置真正的分支,并且从不重新计算。(如果我的术语不太正确,请随意更正)

这是我得到的最接近的一个,它实际上在渲染时而不是编译时打印用户,并正确地进行分支,但抛出一个错误,表示无法解析symbol
节点

(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))))

我从来没有用过金属箔,但我会在黑暗中试一试……这样行吗

(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)))

作品有没有可能让宏
隐藏if
,这样我就可以使用
(hide if(nil?user))
作为最后一个表单?明白了:
(defmacro hide if[b](fn[node]`(if~b nil~node))
。如果可能的话,请随意简化或泛化。奇怪的是,它工作正常(在repl中),但没有编译(使用
lein compile
),这(对我来说)似乎毫无意义,但事实确实如此。下面的代码也进行了编译
(defmacro hide if[b](让[b#b]`(fn[node#](list'if(quote~b#)nil node#))
(t/deftemplate folder-list2
  [[:h1#mnuUsers "header"]]
  [user]
  (t/id= :mnuUsers)
  (fn [node]
    `(if ~'user ~node nil)))