Error: No protocol method Matched.resolve-handler defined for type cljs.core/PersistentHashMap

デキルマンのコードを merge して pull したあとにアプリを起動すると実行時エラーで Error: No protocol method Matched.resolve-handler defined for type cljs.core/PersistentHashMap が出てきた。

エラーメッセージをちゃんと解釈すると cljs.core/PersistentHashMap に対応するプロトコルメソッドの Matched.resolve-handler が定義されてないよってことなんだけど、 master はちゃんと動くので最初理解が出来なかった。このときにちゃんとエラーメッセージを理解しようとすれば良かったんだけど、初めて遭遇したメッセージだったので思わず追跡するのを諦めてしまった(他にも Matched っていうのがどこで定義された protocol なのか分からなかったとかあるんだけどね)。

なんだかんだで半日くらい潰してしまったけど、結局原因は bidi のバグだったという。けど、それも最新のバージョンだと直っているという。

(´・ω・`)

で、このバグが出現する条件が面白くてマップデータで要素が 8 つまでなら cljs.core.PersistentHashMap なんだけど、 8 つ以下なら cljs.core.PersistentArrayMap だから cljs.core.PersistentArrayMap だけを extend してたりするとこういうふうにハマったりする原因になるとさ。

まぁちゃんとエラーメッセージは読みましょう、ってことで。