2025/02/13(木)たまにはプログラミングの話

2025/02/13 21:26
ClojureScriptでnode.jsのライブラリを実装しているのですが、Spyのcalled-with?が思ったように動いてくれずにハマってしまいました。

called-with?の実装は以下のようになっており、
(not (nil? (some #(= args %) (calls f))))
(calls f) の戻り値は想定どおりの値を返しているのですが、someの結果がnilになってしまいます。何でだろうと調べた結果、当たり前のことを勘違いしていました。
(= #js :key "value" #js :key "value")
これって false になるんですね……。JavaScriptのオブジェクトの比較になるので、当然と言えば当然なのですが。

というわけで、callsで引数のリストをシーケンスのまま取得して、js->cljでClojureの世界に持ち込んでから比較するようにしました。おかげでだいぶテストコードが長くなりましたが、まぁ仕方がない。