我正在尝试使用协议(protocol)来创建工程编号类型(“knumber”),因此我可以说(+ "1k" "2Meg")并得到类似"2.001Meg"的内容。我应该能够像(:val my-knumber)这样从knumber中获取浮点值,但是通常打印机应该显示字符串,像(:string my-knumber)这样也可以访问该字符串。该数字将支持所有常见的p,n,u,m,k,Meg,G后缀,并根据需要在它们之间进行转换,例如(/ "1Meg" "1G") -> "1m")。我希望能够将此传递给任何需要数字的函数。

无论如何,有人可以为此建议一个策略吗?我想我需要使用协议(protocol)。我目前有一个(defrecord knumber [val string]),但不确定下一步如何。

Clojure数字满足什么协议(protocol)?我在想我需要为此扩展一些现有的协议(protocol)/接口(interface)。

谢谢

最佳答案

我认为您的策略可能应该如下:

  • 将记录KNumber定义为(defrecord knumber [value unit-map])
  • unit-map映射为单位到整数指数的映射(如果要使用像m/s ^ 2这样的单位,则这些单位是工程数字,对吗?)。它可能看起来像{"m" 1 "s" -2}
  • KNumber实现java.lang.Number,以便您可以将其与Clojure中已经存在的其他数学函数一起使用。您需要实现doubleValuelongValue等。
  • 定义协议(protocol)NumberWithUnits,您可以将其扩展到KNumber和常规clojure数字。至少应具有(numeric-value [number])(get-units [number])
  • 方法
  • 然后在您自己的 namespace 中定义您的数学函数+*-等,这些函数可对实现NumberWithUnits协议(protocol)的任何事物进行操作并返回KNumber
  • 关于不同的单位比例(例如,“m”与“km”),我建议针对每种单位类型的内部表示(例如,距离为“m”)在单个比例尺上进行标准化,但要提供输入转换为其他单位比例的选项/输出目的。
  • 09-11 19:24