即使仔細查看Clojure上的文檔,我也沒有看到任何直接確認Clojure是否支持運算符重載。運算符在Clojure中超載
如果確實如此,有人可以提供一個關於如何超載的快速小例子,比方說,「+」操作符可以委託給一些我們可以稱爲myPlus
的預定義方法。
我是很新來的Clojure,所以有人的幫助將不勝感激。
即使仔細查看Clojure上的文檔,我也沒有看到任何直接確認Clojure是否支持運算符重載。運算符在Clojure中超載
如果確實如此,有人可以提供一個關於如何超載的快速小例子,比方說,「+」操作符可以委託給一些我們可以稱爲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")
一個很好的策略很可能是使你+一個多方法,並調用核心的+功能的數字情況。
看看這個: http://clojure.org/multimethods
某些功能,如+是核心,不能被重新定義。
例如,您可以創建一個新函數並將其命名爲「。+」或「!+」,這在可讀性方面是相似的。
使用上面包含的multimethods URL中的信息,您可以構建一個函數,告訴您要使用哪個實現。
所以,如果我要排除clojure.core/+,我可以執行以下操作(defn + [xy] (myPlus xy))正確嗎?如果是這樣,那正是我想要做的。我如何從我的名字空間中排除clojure.core/+? –
我已將此添加到我的答案中。 – pmf
賓果,正是我在找的!謝謝。 –