如果尝试编译一个尝试调用箭头构造器的defrecord,则我会收到警告。
这
(defrecord Foo [a b]
SomeProtocol
(some-method [_]
(->Foo new-a new-b)))
会显示消息 "WARNING: 在行X使用未声明的Var some.ns/->Foo"。Clojure可以正常接受此形式。
如果切换到点构造器版本,如(Foo. _ _)
则可以编译。
我注意到在clj的defrecord
宏中,->Foo
和map->Foo
的符号首先声明,但在cljs中,相关的build-positional-factory
和build-map-factory
函数在emit-defrecord
之后调用,这可能是个问题?
看起来deftype
应该也有类似的问题,但我还没有测试。