我使用goog.structs.LinkedMap实现了cljs.core/IFn协议,但是无法使用函数形式调用LinkedMap的实例
I use goog.structs.LinkedMap to implement the cljs.core/IFn protocol, but I can’t use the function form to call an instance of LinkedMap
这是我的代码,运行在shadow-cljs.
(ns app.main
(:require [goog.structs.LinkedMap]))
(extend-type goog.structs.LinkedMap
cljs.core/IFn
(-invoke
([m k] (.get m k nil))
([m k not-found] (.get m k not-found))))
(def m (goog.structs.LinkedMap.))
(.set m 34 :foo)
(println (m 34))
报错信息如下:#object[TypeError TypeError: app.main.m is not a function]
但是我运行(type m)
,结果如下:#object[Function]
,这确实是一个函数
sample code and eval result
嗯,这确实是个问题。不久前,我添加了一项优化,使 goog.*
代码的函数调用更快,生成的代码更少。但是,这会阻止 IFn 对这些类型正常工作。所有正常协议都可以正常工作,只有 IFn 是个问题。
我会考虑一下,看看能否想出办法同时保留两者。请打开一个 shadow-cljs github 问题,这样我就不会忘记了。
(type m)
将为您提供 m
的构造函数,这确实是一个函数。 m
是不是函数的实例。
这是我的代码,运行在shadow-cljs.
(ns app.main
(:require [goog.structs.LinkedMap]))
(extend-type goog.structs.LinkedMap
cljs.core/IFn
(-invoke
([m k] (.get m k nil))
([m k not-found] (.get m k not-found))))
(def m (goog.structs.LinkedMap.))
(.set m 34 :foo)
(println (m 34))
报错信息如下:#object[TypeError TypeError: app.main.m is not a function]
但是我运行(type m)
,结果如下:#object[Function]
,这确实是一个函数
sample code and eval result
嗯,这确实是个问题。不久前,我添加了一项优化,使 goog.*
代码的函数调用更快,生成的代码更少。但是,这会阻止 IFn 对这些类型正常工作。所有正常协议都可以正常工作,只有 IFn 是个问题。
我会考虑一下,看看能否想出办法同时保留两者。请打开一个 shadow-cljs github 问题,这样我就不会忘记了。
(type m)
将为您提供 m
的构造函数,这确实是一个函数。 m
是不是函数的实例。