11

だから私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を初めて使用しますが、ここでプロトコルまたはマルチメソッドを使用できるようにすべきではないので、人々がカスタムタイプを作成/使用するときに、これらの関数を「拡張」してシームレスに機能させることができますか? +などがこれを-サポートしていない理由はありますか? (または、そうですか?コードを読んだだけではないようですが、間違って読んでいる可能性があります)。

他のデータ型など、一般的な既存の関数に独自の拡張機能を書きたい場合+、既存の関数や潜在的に他のデータ型とうまく連携するにはどうすればよいですか?

4

3 に答える 3

5

このために正確に設計されたわけではありませんが、core.matrixはいくつかの理由でここで興味深いかもしれません:

  • ソース コードには、プロトコルを使用して、さまざまな種類の操作を定義する方法の例が示されています。たとえば、(+ [1 2] [3 4]) => [4 6]). これがどのように行われるかを検討する価値があります。基本的に、演算子はプロトコルを呼び出す通常の関数であり、各データ型はプロトコルの実装を次の方法で提供します。extend-protocol
  • java.awt.Colorcore.matrix 実装として (つまり、4D RGBA ベクトルとして) 動作させることに興味があるかもしれません。ここで BufferedImage と同様のことをしました: https://github.com/clojure-numerics/image-matrix。基本的な core.matrix プロトコルを実装すると、core.matrix API 全体がColorオブジェクトを操作できるようになります。これにより、さまざまな操作を実装する多くの作業を節約できます。
于 2013-05-12T02:13:11.577 に答える
2

algo.genericalgo.generic.arithmeticで見ることができます。マルチメソッドを使用しています。

于 2013-06-11T11:02:16.177 に答える