2

这是我的代码,在 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],这确实是一个函数。

示例代码和评估结果

4

1 回答 1

1

嗯,这确实是个问题。不久前,我添加了一项优化,以使goog.*代码的函数调用更快并产生更少的代码。但是,这会阻止 IFn 对这些类型正常工作。所有正常的协议都可以正常工作,只有 IFn 是一个问题。

我会考虑一下,看看我是否能找到一种方法来保持两者。请打开一个 shadow-cljs github 问题,这样我就不会忘记。

(type m)将为您提供m确实是一个函数的构造函数。m是不是函数的实例。

于 2020-06-24T08:09:24.817 回答