不同命名空间中的 Clojurescript defprotocol 和 defrecord

Clojurescript defprotocol and defrecord in different namespaces

这很好用:

(ns ns1) 
(defprotocol P
  (foo [this a]))

(defrecord Foo [attr]
  P
  (foo [this a] a))

(println (foo (Foo. "test") "Works!"))

但是当我像这样将协议移动到它自己的命名空间时:

(ns ns2) 
(defprotocol P
  (foo [this a]))

然后抛出 Use of undeclared var ns1/foo

(ns ns1
  (:require ns2 :refer [P]))

(defrecord Foo [attr]
  P
  (foo [this a] a))

(println (foo (Foo. "test") "Undeclared var?"))

我发现 this 写得很好,对 Clojure 和 Java 很有意义。

是否可以让我上面的示例在 clojurescript 中工作?

更新:我知道我错过了一些超级简单的东西!作为记录,如已接受的答案中所述:我所需要的只是像这样参考 foo

(ns ns1
  (:require ns2 :refer [P foo]))

(defrecord Foo [attr]
  P
  (foo [this a] a))

(println (foo (Foo. "test") "Works once again"))

答案就在您链接的博客 post 中。您必须 :refer 您希望使用的协议功能(或者更明确地使用它们,就像现在的风格一样,使用 :require :as)。