Clojure是一個功能性lisp,儘管它運行在JVM上,但它並不是面向對象的,儘管它運行在面嚮對象語言的虛擬機JVM上。 Clojure提供了相同的接口,通過將它們抽象爲一個名爲seq的接口來遍歷列表和向量。這甚至在內部使用名爲ISeq的Java接口來實現。這不是面向對象抽象的例子嗎?如何聲稱Clojure不是面向對象的?Clojure是否面向對象? (在seqs中的多態性)
我想這個問題的必然結果---何時可以將多態性視爲與面向對象不同?
Clojure是一個功能性lisp,儘管它運行在JVM上,但它並不是面向對象的,儘管它運行在面嚮對象語言的虛擬機JVM上。 Clojure提供了相同的接口,通過將它們抽象爲一個名爲seq的接口來遍歷列表和向量。這甚至在內部使用名爲ISeq的Java接口來實現。這不是面向對象抽象的例子嗎?如何聲稱Clojure不是面向對象的?Clojure是否面向對象? (在seqs中的多態性)
我想這個問題的必然結果---何時可以將多態性視爲與面向對象不同?
習慣上的Clojure傾向於定義獨立的函數,這些函數在一小部分核心數據結構上運行;這種方法和數據的分解是一種強烈的反對客體導向和贊成功能風格的陳述。 Rich Hickey(Clojure的創始人)已多次聲明這一點的重要性;例如:"Clojure eschews the traditional object-oriented approach of creating a new data type for each new situation, instead preferring to build a large library of functions on a small set of types."。
在Clojure中,對核心數據結構的依賴比在其他函數式語言中更重要,因爲當您使用Clojure的持久數據結構時,您只會從Clojure的STM中獲得全部好處。
我想這個問題的必然結果---何時可以將多態性視爲與面向對象不同?
我使用Clojure的multimethods(即多態設施)根據文件名的擴展名分派到不同的實現 - 不是面向對象,而是多態。
「最好在一個數據結構上運行100個函數,而不是在10個數據結構上運行10個函數。」 - Alan J. Perlis – Jonas 2009-10-10 18:24:31
我想這個問題的必然結果---何時可以認爲多態性與面向對象不同?
多態性與面向對象完全沒有關係。它只是意味着,根據操作數的類型,相同的操作可以有不同的表現。
像ML或Haskell這樣的函數語言已經有了30多年的多態性,對PL歷史有更深入瞭解的人可能會指出1962年以前的一些例子(即OO之前)。 Christopher Strachey在1967年描述了參數多態性和ad-hoc多態性之間的區別,所以多態性必須有已經存在於之後。由於多態性僅在Simula-67中的OO中引入,因此我猜測多態性在OO中引入之前必須存在。
Clojures多態性是Java的自然延伸。在java中,方法是按類分派。在clojure中,這個擴展允許你根據你想要的任何東西發送呼叫。它在課堂上派發仍然非常容易,事實上大部分時間都是如此。如果你想要別的東西,那麼你可以寫你自己的調度員。內置函數derive
根據您想要的任何內容創建層次結構,然後在isa
上發送。
更多善良的一面:http://clojure.org/multimethods
記住的東西像ISEQ是Java。
在Clojure中,seq抽象實際上只是'某些',你可以提供給第一個,休息和第n個函數(注意你不要先調用seq,你先用seq參數調用)。 Clojure語言的核心功能都是對集合,seqs或原始類型進行操作。在暴露的接口中沒有與方法捆綁的數據。所以Clojure的實現是用Java編寫的,所有與JVM互操作都將涉及類/對象,但是Clojure本身並不支持。
Clojure不鼓勵使用數據結構綁定方法。
說了這麼多......事實上,功能確實會限制他們將使用哪些參數。第一次休息和第n次只會對可能是seq的東西起作用。從這個角度來看,數據結構是否與方法捆綁在一起沒有太大的區別 - 你仍然必須正確匹配它們。大的勝利來自靈活性。函數可以被寫入帶任何參數,然後用高階函數組成沒有定義類等:
(def farms [{:name "Swansea", :value 100}
{:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]}
{:name "Snug", :value 50, :animals [:goats :pigs]}])
(reduce + (map :value farms))
-> 350
(reduce + (map :value (filter :animals farms)))
-> 50
鏈接到源「據說不是在所有面向對象」將是搞清楚是否論據有幫助技術與政治...... – 2009-10-10 20:34:35
http://clojure.org/rationale談論面向對象和爲什麼Clojure避免它。 – 2009-10-11 22:33:46
http://blog.thinkrelevance.com/2009/8/12/rifle-oriented-programming-with-clojure-2是一篇有趣的文章,討論了Clojure如何實際允許使用所有主要的OO主體。但是我發現很難將它們結合起來。例如使用閉包封裝通過繼承排除擴展。一般的做法似乎是放棄封裝以支持可擴展性。 – 2009-10-12 23:56:30