【发布时间】:2013-05-12 00:16:59
【问题描述】:
所以我想使用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))或者
useing 命名空间并在需要数字数学时使用clojure.core/-。 将一个特殊情况编码到您的
-实现中,当您的实现传递一个Number时,它会传递到clojure.core/-。
不幸的是,我不喜欢其中任何一个。第一个可能是最干净的,因为第二个假设您唯一关心的数学运算就是它们的新数据类型和数字。
我是 Clojure 的新手,但我们不应该在这里使用协议或多方法,这样当人们创建/使用自定义类型时,他们就可以“扩展”这些功能,让它们无缝地工作吗? +,- 等是否有理由不支持这个? (或者是吗?从我阅读代码来看,它们似乎不是,但也许我读错了)。
如果我想为其他数据类型编写自己的对常见现有函数(例如 +)的扩展,我应该怎么做才能很好地与现有函数和可能的其他数据类型一起使用?
【问题讨论】:
-
我也是 Clojure 的新手。为什么不能为此使用协议?
-
如果您阅读
core/+的源代码,它不会使用一个,所以没有什么可以挂钩的。不过请查看 mikera 的答案,并按照他的代码进行操作,您将了解如何可以使用协议来做到这一点。
标签: clojure protocols multimethod