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

不同名称空间中的Clojurescript defprotocol和defrecord,clojure,clojurescript,Clojure,Clojurescript,这很好: (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])) 然后这会抛出一个使用未声明的var ns1/fo

这很好:

(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]))
然后这会抛出一个
使用未声明的var ns1/foo

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

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

(println (foo (Foo. "test") "Undeclared var?"))
我发现这篇文章写得很好,对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"))

答案就在你链接的博文中。你必须
:引用你希望使用的协议函数(或者更明确地使用它们,就像现在的风格一样,使用
:require:as
)。

答案就在你链接的博客文章中。您必须
:引用您希望使用的协议函数(或者更明确地使用它们,就像现在的样式一样,使用
:require:as