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 issue を開いてください。

は、実際に関数である(type m)コンストラクターを取得します。関数ではないインスタンスです。mm

于 2020-06-24T08:09:24.817 に答える