Clojure 符号与宏中的错误命名空间关联
我有一个宏:Clojure 符号与宏中的错误命名空间关联,clojure,macros,clojurescript,Clojure,Macros,Clojurescript,我有一个宏: (defmacro widget [msg-type value & app-key] `(defrecord ~msg-type [~value] Message (~'process-message [msg# app#] (let [state# (~@app-key app#)] (dissoc (->> (merge state# msg#)
(defmacro widget [msg-type value & app-key]
`(defrecord ~msg-type [~value]
Message
(~'process-message [msg# app#]
(let [state# (~@app-key app#)]
(dissoc
(->>
(merge state# msg#)
(assoc app# ~@app-key))
:errors)))))
消息
是中定义的协议,具有处理消息
功能
当我尝试像这样使用小部件时
(ns my.cljs.ns
(:require-macros [my.ns.macros :as macro])
(:require [petrol.core :refer [Message]]))
(macro/widget A-Record a-field :a-key)
我得到这个错误:
Bad method signature in protocol implementation,
my.ns.macros/Message does not declare method called
process-message ...
我怎样才能让消息引用到汽油机/Message
而不是我的.ns.macros/Message
?你需要神秘的~'操作符的力量:)
我看到您已经为处理消息调用了它,所以您可能已经知道了原因;但出于回答的目的,backtick中的内容完全限定了名称空间,其中as evaluate quote将文字符号放置到位
(macroexpand-1 '(widget :a :b))
错误消息表明,如果要避免将当前的ns连接到消息,则需要~”消息
然而,在我看来,使用petrol名称空间完全限定消息将是一个好的举措
petrol.core/Message
这样,您就不必依赖于ns声明中引用它。注意,您也不需要~'它
另外,我会对(~@app-key-app#)保持警惕,因为app-key是可选的。。。你无法获得任何调用任何应用程序的消息,这听起来不像是你想要发生的事情。同样地,通过不止一个似乎更容易。也许它应该是一个必需的参数