【发布时间】:2010-12-04 20:16:45
【问题描述】:
即使仔细查看有关 Clojure 的文档,我也没有看到任何关于 Clojure 是否支持运算符重载的直接确认。
如果是这样,有人可以快速告诉我如何重载,比如“+”运算符,以委托给我们可以调用 myPlus 的一些预定义方法。
我是 Clojure 的非常新手,因此非常感谢有人提供帮助。
【问题讨论】:
标签: functional-programming clojure operator-overloading
即使仔细查看有关 Clojure 的文档,我也没有看到任何关于 Clojure 是否支持运算符重载的直接确认。
如果是这样,有人可以快速告诉我如何重载,比如“+”运算符,以委托给我们可以调用 myPlus 的一些预定义方法。
我是 Clojure 的非常新手,因此非常感谢有人提供帮助。
【问题讨论】:
标签: functional-programming clojure operator-overloading
Clojure(和任何 Lisp 一样)的操作符都是普通函数;您可以像函数一样定义“运算符”:
(defn ** [x y] (Math/pow x y))
“+”运算符(和其他一些数学运算符)是 Clojure 中的一种特殊情况,因为它是内联的(至少对于二进制情况)。您可以通过不在命名空间中引用 clojure.core(或排除 clojure.core/+)在一定程度上避免这种情况,但这可能非常麻烦。
创建一个重新定义 + 的命名空间:
(ns my-ns
(:refer-clojure :exclude [+]))
(defn + [x y] (println x y))
(+ "look" "ma")
一个好的策略可能是让你的 + 成为一个多方法并为数字情况调用核心的 + 函数。
【讨论】:
看看这个: http://clojure.org/multimethods
某些函数,如 + 是核心,不能重新定义。
您可以创建一个新函数并将其称为“.+”或“!+”,这在可读性方面是相似的。
使用上面包含的多方法 URL 中的信息,您可以构建一个函数来告诉您的 .+ 使用哪个实现。
【讨论】:
+ 可以在不同的命名空间中轻松重新定义。事实上,如果你愿意,你甚至可以在 clojure.core 中重新定义+(虽然不推荐......)