Clojure中的运算符重载

Rya*_*chi 16 functional-programming operator-overloading clojure

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

如果确实如此,有人可以向我提供如何超载的快速信息,比方说,"+"运算符委托我们可以调用的一些预定义方法myPlus.

我对Clojure 新,所以非常感谢有人的帮助.

pmf*_*pmf 24

Clojure(就像任何Lisp的)运算符都是普通的函数; 你可以像函数一样定义一个"运算符":

(defn ** [x y] (Math/pow x y))
Run Code Online (Sandbox Code Playgroud)

"+"运算符(以及其他一些数学运算符)是Clojure中的一个特例,因为它是内联的(至少对于二进制情况).您可以在某种程度上通过不在您的命名空间中引用clojure.core(或排除clojure.core/+)来避免这种情况,但这可能非常多毛.

要创建一个名称空间,其中+被重新定义:

(ns my-ns
  (:refer-clojure :exclude [+]))

(defn + [x y] (println x y))

(+ "look" "ma")
Run Code Online (Sandbox Code Playgroud)

一个好的策略可能是使你的+一个多方法并为数字案例调用核心的+函数.


z5h*_*z5h 6

看看这个:http: //clojure.org/multimethods

某些功能,如+是核心功能,无法重新定义.

您可以创建一个新函数,并将其称为".+"或"!+",这在可读性方面类似.

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