【问题标题】:Operator Overloading in ClojureClojure 中的运算符重载
【发布时间】:2010-12-04 20:16:45
【问题描述】:

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

如果是这样,有人可以快速告诉我如何重载,比如“+”运算符,以委托给我们可以调用 myPlus 的一些预定义方法。

我是 Clojure 的非常新手,因此非常感谢有人提供帮助。

【问题讨论】:

    标签: functional-programming clojure operator-overloading


    【解决方案1】:

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

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

    【讨论】:

    • 那么,如果我要排除 clojure.core/+,我可以执行以下 (defn + [x y] (myPlus x y)) 正确吗?如果是这样,那正是我想做的。如何从我的命名空间中排除 clojure.core/+?
    • 我已将此添加到我的答案中。
    • 宾果游戏,正是我要找的!谢谢。
    • 实际上,在尝试了这个之后:它似乎不起作用。我试了一下,得到以下错误: java.lang.Exception: Name conflict, can't def + because namespace: my-ns refer to:#'clojure.core/+ (NO_SOURCE_FILE:5)
    • 请启用公开编辑功能,以便我对您的答案进行投票(并给您当之无愧的 +1)
    【解决方案2】:

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

    某些函数,如 + 是核心,不能重新定义。

    您可以创建一个新函数并将其称为“.+”或“!+”,这在可读性方面是相似的。

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

    【讨论】:

    • 你没有以某种方式回答他的问题。
    • + 可以在不同的命名空间中轻松重新定义。事实上,如果你愿意,你甚至可以在 clojure.core 中重新定义+(虽然不推荐......)
    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2015-03-22
    相关资源
    最近更新 更多