7

プロトコルを使用してエンジニアリング番号タイプ(「knumber」)を作成しようとしているので、の(+ "1k" "2Meg")ようなものを取得できます"2.001Meg"。このようにknumberから浮動小数点値を取得できるはずですが(:val my-knumber)、通常、プリンターは文字列を表示する必要があります。これもこのようにアクセスできます(:string my-knumber)。この番号は、通常のすべてのp、n、u、m、k、Meg、Gサフィックスをサポートし、必要に応じて、などのそれらの間で変換し(/ "1Meg" "1G") -> "1m")ます。これを、数値を期待するすべての関数に渡せるようにしたいと思います。

とにかく、誰かがこれのための戦略を提案できますか?プロトコルを使う必要があると思います。私は現在持っていますが、(defrecord knumber [val string])次に何が起こるかわかりません。

clojure番号はどのプロトコルを満足させますか?このために、いくつかの既存のプロトコル/インターフェースを拡張する必要があると思います。

ありがとう

4

2 に答える 2

4

あなたの戦略はおそらく次のようにすべきだと思います:

  • KNumberレコードを次のように定義します(defrecord knumber [value unit-map])
  • 単位unit-mapのマップを整数指数に作成します (これらが工学数である場合、m/s^2 のような単位が必要になりますよね?)。{"m" 1 "s" -2}のように見えるかもしれません。
  • Clojure に既に存在する他の数学関数で使用できるようにKNumber実装してください。などを実装するjava.lang.Number必要があります。doubleValuelongValue
  • s と通常の clojure 番号のNumberWithUnits両方に拡張できるプロトコルを定義します。KNumber少なくとも、メソッド(numeric-value [number])(get-units [number])
  • +次に、数学関数などを独自の名前空間で定義し、プロトコルを実装するものすべてを操作して*を返します。-NumberWithUnitsKNumber
  • 異なる単位スケール (例: "m" と "km") については、各単位タイプ (例: 距離の "m") の内部表現を 1 つのスケールで標準化することをお勧めしますが、入力/出力目的。
于 2012-08-05T03:14:12.343 に答える
0

frinj ライブラリは、単位を使用した計算用の Clojure ライブラリです。ソースを調べると、おそらくいくつかの素晴らしいアイデアが得られます。

于 2012-08-07T12:07:37.657 に答える