当前位置 : 主页 > 大数据 > 区块链 >

如何在Clojure中扩展数值协议

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在尝试使用协议来创建工程数字类型(“knumber”),所以我可以说(“1k”“2Meg”)并获得类似“2.001Meg”的东西.我应该能够从knumber中得到浮点值(:val my-knumber),但通常打印机应该显示字
我正在尝试使用协议来创建工程数字类型(“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数字有什么协议可以满足?我想我需要为此扩展一些现有的协议/接口.

谢谢

我认为你的策略应该如下:

>将记录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”),但提供转换为其他单位尺度以供输入的选项/输出目的.

网友评论