だから私java.awt.Color
は何かに使いたいです、そして私はこのようなコードを書くことができるようにしたいです:
(use 'java.awt.Color)
(= Color/BLUE (- Color/WHITE Color/RED Color/GREEN))
のコア実装を見ると、-
具体的には について語らclojure.lang.Numbers
れています。これは、コア実装に「フック」して拡張するために私がすることは何もないことを意味します。
インターネットで調べてみると、人々が行っていることは 2 つあります。
関心のあるデータ型についてのみ知っている独自の
defn -
関数を作成します。これを使用するには、おそらく名前空間のプレフィックスを付けることになるため、次のようになります。(= Color/BLUE (scdf.color/- Color/WHITE Color/RED Color/GREEN))
または、代わり
use
に名前空間を使用clojure.core/-
して、数値計算が必要な場合に使用します。実装に が渡されるときに に渡される特別なケースを
-
実装にコーディングします。clojure.core/-
Number
残念ながら、私はどちらも好きではありません。1 つ目はおそらく最もクリーンです。2 つ目は、計算対象は新しいデータ型と数値だけであると想定しているためです。
私はClojureを初めて使用しますが、ここでプロトコルまたはマルチメソッドを使用できるようにすべきではないので、人々がカスタムタイプを作成/使用するときに、これらの関数を「拡張」してシームレスに機能させることができますか? +
などがこれを-
サポートしていない理由はありますか? (または、そうですか?コードを読んだだけではないようですが、間違って読んでいる可能性があります)。
他のデータ型など、一般的な既存の関数に独自の拡張機能を書きたい場合+
、既存の関数や潜在的に他のデータ型とうまく連携するにはどうすればよいですか?