4
我試圖實施宏或宏,並想出了一個問題。爲什麼Clojure不支持宏中的私有函數?
我無法在宏中使用私有函數。
這裏是例如:
私有函數
宏
(defmacro xor
([] true)
([x] x)
([x & next]
`(let [first# ~x
second# ~(first next)]
(if (= (count '~next) 1)
(xor-result first# second#)
(xor (xor-result first# second#) [email protected](rest next))))))
這裏是錯誤:
CompilerException java.lang.IllegalStateException: var: #'kezban.core/xor-result is not public
問題解決當我刪除^:私人標誌。
問題是:這種行爲的原因是什麼?
更新:我可以用私有函數具有以下方法。
私有函數
(defn ^:private xor-result
[x y]
(if (and x y)
false
(or x y)))
新宏
(defmacro xor
([] true)
([x] x)
([x & next]
(let [first x
second `(first '([email protected]))
result (xor-result (eval first) (eval second))]
`(if (= (count '~next) 1)
~result
(xor ~result [email protected](rest next))))))
[ns1:refer [xor]]在此代碼示例中。 xor是指什麼? –
啊,錯字,固定。 –
我添加了使用私人功能的新方法。你能解釋這種行爲嗎? –