我正在尝试使用协议来创建工程数字类型(“knumber”),所以我可以说(+ "1k" "2Meg")
并获得类似"2.001Meg"
的内容。我应该能够从像(:val my-knumber)
这样的knumber获得浮点值,但通常打印机应该显示字符串,也可以像(:string my-knumber)
那样访问。这个数字将支持所有常用的p,n,u,m,k,Meg,G后缀,并根据需要进行转换,例如(/ "1Meg" "1G") -> "1m")
。我希望能够将此传递给任何需要数字的函数。
无论如何,有人可以建议一个策略吗?我想我需要使用协议。我目前有(defrecord knumber [val string])
,但我不确定下一步是什么。
clojure数字的协议是什么?我想我需要扩展一些现有的协议/接口。
由于
答案 0 :(得分:4)
我认为你的策略应该如下:
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
协议的任何内容进行操作并返回{{1 }}。 答案 1 :(得分:0)
frinj library是一个用于计算单位的Clojure库。查看源代码可能会给你一些好主意。