我使用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 是不是函数的实例。