我正在尝试使用协议(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中已经存在的其他数学函数一起使用。您需要实现doubleValue
,longValue
等。NumberWithUnits
,您可以将其扩展到KNumber
和常规clojure数字。至少应具有(numeric-value [number])
和(get-units [number])
+
,*
,-
等,这些函数可对实现NumberWithUnits
协议(protocol)的任何事物进行操作并返回KNumber
。