functional-programming - Clojure 中的运算符重载

标签 functional-programming clojure operator-overloading

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

如果确实如此,有人可以为我提供一个快速的片段,说明如何重载“+”运算符来委托(delegate)给我们可以调用的某个预定义方法myPlus

我对 Clojure 非常陌生,因此非常感谢有人提供帮助。

最佳答案

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

一个好的策略可能是使您的 + 成为多方法并针对数字情况调用核心的 + 函数。

关于functional-programming - Clojure 中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1535176/

相关文章:

clojure - 用于将 Clojure .clj 编译为 .class/.jar 的简单工具

loops - clojure for loop,将值存储在集合或映射中

Clojure.test 抛出?不在 repl 中工作

arrays - 在 Shell 脚本中组织一系列数据

javascript - 函数式编程: Calling a Curried Function

c++ - strcpy/strcat 奇怪字符输出

c++ - 为什么析构函数被调用两次?

C++ If 语句判断给定值是否为数字

javascript - 使用 Ramda 比较 2 个数组并找到相等的值

scala - 将 Iterable[Either[A,B]] 减少到任一个 [A, Iterable[B]]