Functional programming Clojure中的运算符重载

Functional programming Clojure中的运算符重载,functional-programming,clojure,operator-overloading,Functional Programming,Clojure,Operator Overloading,即使仔细查看有关Clojure的文档,我也看不到任何关于Clojure是否支持运算符重载的直接确认 如果是这样的话,有没有人能为我提供一个快速的小技巧,告诉我如何重载,比如说“+”操作符来委托给一些预定义的方法,我们可以调用myPlus 我是Clojure的新手,因此非常感谢您的帮助。请看以下内容: 某些函数,如+是核心函数,无法重新定义 例如,您可以创建一个新函数并将其命名为“+”或“!+”,这在可读性方面类似 使用上面包含的multimethods URL中的信息,您可以构建一个函数,告诉

即使仔细查看有关Clojure的文档,我也看不到任何关于Clojure是否支持运算符重载的直接确认

如果是这样的话,有没有人能为我提供一个快速的小技巧,告诉我如何重载,比如说“+”操作符来委托给一些预定义的方法,我们可以调用
myPlus

我是Clojure的新手,因此非常感谢您的帮助。

请看以下内容:

某些函数,如+是核心函数,无法重新定义

例如,您可以创建一个新函数并将其命名为“+”或“!+”,这在可读性方面类似

使用上面包含的multimethods URL中的信息,您可以构建一个函数,告诉您的.+要使用哪个实现。

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")

一个好的策略可能是将你的+变成一个多方法,并为数字案例调用core的+函数。

你没有以这种或那种方式回答他的问题。
+
可以很容易地在不同的名称空间中重新定义。事实上,如果您愿意,您甚至可以在clojure.core中重新定义
++
(尽管不推荐……),因此,如果我排除clojure.core/+,我可以执行以下操作(defn+[xy](myPlus xy))对吗?如果是这样,那正是我想要做的。如何将clojure.core/+从我的命名空间中排除?我已将此添加到我的答案中。宾果,这正是我要寻找的!谢谢。事实上,试过这个之后:它似乎不起作用。我尝试了一下,得到了以下错误:java.lang.Exception:名称冲突,无法定义+,因为名称空间:my ns引用:#'clojure.core/+(NO#u SOURCE_文件:5)请启用公共编辑,这样我就可以修正我对您答案的投票(并给您一个当之无愧的+1)