所以我想用java.awt.Color
一些东西,我希望能够编写这样的代码:
(use 'java.awt.Color)
(= Color/BLUE (- Color/WHITE Color/RED Color/GREEN))
查看 的核心实现-
,它专门讨论clojure.lang.Numbers
,这对我来说意味着我没有做任何事情来“挂钩”核心实现并对其进行扩展。
在互联网上环顾四周,人们似乎做了两种不同的事情:
编写他们自己的
defn -
函数,该函数只知道他们感兴趣的数据类型。要使用你可能最终会为命名空间添加前缀,例如:(= Color/BLUE (scdf.color/- Color/WHITE Color/RED Color/GREEN))
或者,在需要数字数学时
use
使用命名空间并使用。clojure.core/-
将一个特殊情况编码到您的
-
实现中,clojure.core/-
当您的实现通过Number
.
不幸的是,我不喜欢其中任何一个。第一个可能是最干净的,因为第二个假设您唯一关心的数学运算是它们的新数据类型和数字。
我是 Clojure 的新手,但我们不应该在这里使用协议或多方法,这样当人们创建/使用自定义类型时,他们可以“扩展”这些功能,让它们无缝工作吗?+
有没有理由-
不支持这个?(或者是吗?从我阅读代码来看,它们似乎不是,但也许我读错了)。
如果我想为常见的现有函数(例如其他数据类型)编写自己的扩展+
,我应该怎么做才能很好地与现有函数和可能的其他数据类型一起使用?