Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 符号与宏中的错误命名空间关联_Clojure_Macros_Clojurescript - Fatal编程技术网

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是可选的。。。你无法获得任何调用任何应用程序的消息,这听起来不像是你想要发生的事情。同样地,通过不止一个似乎更容易。也许它应该是一个必需的参数