2009-10-08 76 views
15

即使仔細查看Clojure上的文檔,我也沒有看到任何直接確認Clojure是否支持運算符重載。運算符在Clojure中超載

如果確實如此,有人可以提供一個關於如何超載的快速小例子,比方說,「+」操作符可以委託給一些我們可以稱爲myPlus的預定義方法。

我是新來的Clojure,所以有人的幫助將不勝感激。

回答

23

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

一個很好的策略很可能是使你+一個多方法,並調用核心的+功能的數字情況。

+0

所以,如果我要排除clojure.core/+,我可以執行以下操作(defn + [xy] (myPlus xy))正確嗎?如果是這樣,那正是我想要做的。我如何從我的名字空間中排除clojure.core/+? –

+0

我已將此添加到我的答案中。 – pmf

+0

賓果,正是我在找的!謝謝。 –

4

看看這個: http://clojure.org/multimethods

某些功能,如+是核心,不能被重新定義。

例如,您可以創建一個新函數並將其命名爲「。+」或「!+」,這在可讀性方面是相似的。

使用上面包含的multimethods URL中的信息,您可以構建一個函數,告訴您要使用哪個實現。

+0

你沒有以某種方式回答他的問題。 – chollida

+0

我已添加更多信息。 – z5h

+0

更新確實有助於讓這個更好的答案! – chollida