Clojure:支持meta的最小数量实现?

abo-abo

我想在Clojure中实现一些基本的物理/化学公式。我不想强调性能,而是强调便利性,因此主要功能是类型检查。我当时认为将meta附加到数字上可以完成任务。

例如,此功能:

(defn force [mass accel]
  (* mass accel))

应该

  1. 访问第一个参数的元
  2. 确保它是质量类型,即千克,克等。如果不是,则抛出错误。
  3. 将数值转换为千克。
  4. 进行相同的加速。
  5. 返回带有牛顿元的结果。

我可以*在名称空间中适当地重载和其他功能。

唯一的问题是不可能将meta附加到Double获得类似数字但可以包含元数据的东西的好方法是什么?

胡安·法科罗

这是使用的方法gen-class我只是嘲笑了检查和归一化单元的功能。实现的唯一操作是*在中使用的操作force

请注意,由于该代码正在使用gen-class,因此compile您需要将以下代码保存到leiningen项目文件夹big_decimal_meta.cljsrc文件夹中命名文件中,然后进行加载。

BigDecimalMeta使用gen-class

(ns big-decimal-meta
  (:refer-clojure :exclude [* force])
  (:gen-class
    :name        BigDecimalMeta
    :extends     java.math.BigDecimal
    :state       metadata
    :init        init
    :implements  [clojure.lang.IObj]))

(defn -init [& args]
  [args (atom nil)])

(defn -withMeta [this metadata]
  (reset! (.metadata this) metadata)
  this)

(defn -meta [this]
  (deref (.metadata this)))

(compile 'big-decimal-meta)

*force通过一些示例代码起作用:

(def x (with-meta (BigDecimalMeta. 1) {:unit :kg}))
(def y (with-meta (BigDecimalMeta. 3.5) {:unit :mss}))
(def z (with-meta (BigDecimalMeta. 4.5) {:unit :V}))

(defn unit [x]
  (-> x meta :unit))

(defn * [x y]
  (BigDecimalMeta. (str (.multiply x y))))

(defn mass? [x]
  (#{:kg :gr :mg ,,,} (unit x)))

(defn accel? [x]
  (#{:mss ,,,} (unit x)))

(defn to-kg [x] x)
(defn to-mss [x] x)

(defn force [mass accel]
  (assert (mass? mass))
  (assert (accel? accel))
  (let [mass   (to-kg  mass)
        accel  (to-mss accel)]
    (with-meta (* mass accel) {:unit :N})))

(println (force x y) (meta (force x y))) 
(println (force x z) (meta (force x z)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中递归地实现“最小数量的硬币”

来自分类Dev

PostgreSQL获得最小数量(*)?

来自分类Dev

PostgreSQL获得最小数量(*)?

来自分类Dev

TEdit:自动完成并限制最小数量

来自分类Dev

SVG的最小数量是多少?

来自分类Dev

删除最小数量的重叠圆?

来自分类Dev

SQL:如何获取最小数量?

来自分类Dev

查找最小数量并打印的功能

来自分类Dev

查找交换的最小数量以对数组进行排序

来自分类Dev

如何计算最大字符串的最小数量?

来自分类Dev

如何找到最小数量的几个变量并返回列名

来自分类Dev

尝试确定Java数组中的最小数量和位置

来自分类Dev

寻找所需的“中心点”的最小数量

来自分类Dev

盖“曼哈顿天际线”使用矩形的最小数量

来自分类Dev

在涵盖特定值的列表中查找最小数量的元素

来自分类Dev

对数组进行排序的“插入”的最小数量

来自分类Dev

如何计算mysql上A和B的最小数量?

来自分类Dev

如何找到最小数量的几个变量并返回列名

来自分类Dev

从数组中选择最小数量并删除其余的JavaScript

来自分类Dev

Optaplanner:如何处理连续的最小数量

来自分类Dev

修改numpy数组以获取元素之间的最小数量的值

来自分类Dev

如何在for循环中找到最小数量?

来自分类Dev

更新基于最小数量与状态列在mysql中的列?

来自分类Dev

快速选择算法以找到第k个最小数的实现

来自分类Dev

快速选择算法以找到第k个最小数的实现

来自分类Dev

使用 for 循环而不是每个循环的最小数量和平均数量

来自分类Dev

在C#中实现小数。可以对其进行修改以支持重复小数吗?

来自分类Dev

C#Regex字符串中字母数字的最小数量,但可用最小数量中不包含的空格包围

来自分类Dev

Oracle SQL-具有最大和最小数量的最新记录列表

Related 相关文章

  1. 1

    在Python中递归地实现“最小数量的硬币”

  2. 2

    PostgreSQL获得最小数量(*)?

  3. 3

    PostgreSQL获得最小数量(*)?

  4. 4

    TEdit:自动完成并限制最小数量

  5. 5

    SVG的最小数量是多少?

  6. 6

    删除最小数量的重叠圆?

  7. 7

    SQL:如何获取最小数量?

  8. 8

    查找最小数量并打印的功能

  9. 9

    查找交换的最小数量以对数组进行排序

  10. 10

    如何计算最大字符串的最小数量?

  11. 11

    如何找到最小数量的几个变量并返回列名

  12. 12

    尝试确定Java数组中的最小数量和位置

  13. 13

    寻找所需的“中心点”的最小数量

  14. 14

    盖“曼哈顿天际线”使用矩形的最小数量

  15. 15

    在涵盖特定值的列表中查找最小数量的元素

  16. 16

    对数组进行排序的“插入”的最小数量

  17. 17

    如何计算mysql上A和B的最小数量?

  18. 18

    如何找到最小数量的几个变量并返回列名

  19. 19

    从数组中选择最小数量并删除其余的JavaScript

  20. 20

    Optaplanner:如何处理连续的最小数量

  21. 21

    修改numpy数组以获取元素之间的最小数量的值

  22. 22

    如何在for循环中找到最小数量?

  23. 23

    更新基于最小数量与状态列在mysql中的列?

  24. 24

    快速选择算法以找到第k个最小数的实现

  25. 25

    快速选择算法以找到第k个最小数的实现

  26. 26

    使用 for 循环而不是每个循环的最小数量和平均数量

  27. 27

    在C#中实现小数。可以对其进行修改以支持重复小数吗?

  28. 28

    C#Regex字符串中字母数字的最小数量,但可用最小数量中不包含的空格包围

  29. 29

    Oracle SQL-具有最大和最小数量的最新记录列表

热门标签

归档