我正在尝试使用协议来创建工程数字类型(“knumber”),所以我可以说(“1k”“2Meg”)并获得类似“2.001Meg”的东西.我应该能够从knumber中得到浮点值(:val my-knumber),但通常打印机应该显示字
无论如何,有人可以建议一个策略吗?我想我需要使用协议.我目前有一个(defrecord knumber [val string]),但我不确定下一步是什么.
clojure数字有什么协议可以满足?我想我需要为此扩展一些现有的协议/接口.
谢谢
我认为你的策略应该如下:>将记录KNumber定义为(defrecord knumber [value unit-map])
>将单位映射单位映射到整数指数(如果这些是工程数,你会想要m / s ^ 2这样的单位,对吧?).它可能看起来像{“m”1“s”-2},
>让KNumber实现java.lang.Number,以便您可以将它与Clojure中已存在的其他数学函数一起使用.你需要实现doubleValue,longValue等.>定义一个协议NumberWithUnits,你可以扩展到KNumbers和普通的clojure数字.它至少应该有方法(数值[数字])和(获取单位[数字])>然后在您自己的命名空间中定义您的数学函数*, – 等,这些函数对任何实现NumberWithUnits协议的函数进行操作并返回一个KNumber.>关于不同的单位尺度(例如“m”与“km”),我建议在单一尺度上标准化每种单位类型的内部表示(例如距离“m”),但提供转换为其他单位尺度以供输入的选项/输出目的.