Dot-Net
clojure vs c# 語言
我仍在嘗試了解 clojure 的明顯好處。我知道它是一種動態的、[幾乎] 純粹的函式式語言,非常適合單元測試、並發和快速開發。
我正在觀看其創始人 Rich Hickey 的演講。
在第 25 分鐘左右,您可以看到 clojure 通過動態定義列表和向量的能力使程式變得簡單的許多絕妙方法:
( 123) [123]將那些動態定義的向量用作函式的能力
([ 123] 0)能夠在新定義的字元串上呼叫函式
(.ToUpperCase "foo")正如 Rich 所說,“文字的語法就是語言的語法”……漂亮。
但是在.net 4.0 中不能進行這種程式風格嗎?(雖然更健談)
(new[] {1,2,3})[0] "foo".ToUpper()等..net也可以用於以功能方式進行程式(儘管沒有強制執行)
這些都是微不足道的例子,但似乎這是 clojure 的基礎。有哪些特性讓 clojure 更加與眾不同,並在某些情況下使其成為更好的選擇?
我個人認為,一旦你掌握了 Clojure 的語法,它就非常有效、簡潔甚至美觀。然而,在我看來,這並不是選擇一種語言的最令人信服的理由。
在多年使用 Java 和 C# 之後,我更喜歡 Clojure 作為我“首選的通用開發語言”的個人原因是:
- 宏元程式- Clojure 是一個 Lisp 並繼承了 Lisp 家族“程式碼就是數據”的座右銘。因為語言本身是以一種形式編寫的,這種形式本身就是該語言中的一種資料結構(這稱為Homoiconicity),因此編寫程式碼以您選擇的任何形式生成程式碼都是微不足道的。您基本上再也不需要擔心“設計模式”了——如果您想使用的語言中缺少某些東西,您只需使用宏擴展語言並繼續前進……
- 預設情況下是動態的——Clojure 預設情況下是一種動態語言,這意味著它會以靈活的方式自動為大多數任務“做正確的事”。這具有使您更有效率的效果。範例是自動溢出到 BigInteger 算術,能夠將您喜歡的任何對像類型放入集合中,從不需要聲明參數類型等。同時,如果需要,您可以指定類型資訊以提高性能(通過直接使用原語或例如提供類型提示) - 這樣您就可以在需要時獲得非常快的性能。
- 強調具有持久性、不可變資料結構和惰性求值的函式式程式——特別是所有核心 Clojure 庫都旨在預設支持這種開發風格。一旦你掌握了竅門(我承認這並不容易……) FP 就異常強大。雖然您可以在幾乎任何語言中模擬“FP 風格”程式碼,但只有當它是該語言的普遍特性時,您才能真正獲得全部優勢(Clojure、Haskell、ML 最明顯地出現在腦海中)
- 優秀的多核並發。感謝一個非常新穎的 STM 系統,我相信 Clojure 擁有目前所有語言中最好的並發故事(請參閱此影片以了解 Rich Hickey 本人的更多詳細說明)
- 開源庫生態系統——我是開源的忠實粉絲,Clojure 是一種非常“開源”的友好語言。語言本身和幾乎每個庫都是開源的,如果這對您來說還不夠,那麼呼叫 Java 庫就很簡單了。鑑於整個 Java/JVM 開源生態系統的廣度,這意味著您想做的幾乎所有事情都可以在庫中輕鬆獲得(與大多數新語言相比,這是一個很大的優勢!)
- JVM 互操作性——你可能關心也可能不關心,但就我個人而言,能夠與 Java/JVM 世界中的庫和工具集成是一個重要的特性。Clojure 讓這一切變得非常簡單——Clojure 對象實際上是JVM 對象,呼叫 Java 方法通常很簡單
(.someMethod someObject someParameter)- REPL 的互動式開發- 典型的 Clojure 開發風格是與 REPL 上正在執行的 Clojure 程序進行互動。您幾乎可以即時重新定義任何東西,而無需執行編譯/建構/測試週期。這是一種非常高效的工作方式——我基本上在 REPL 上建構了一個正在執行的程序,然後將正確的命令複製到源文件中以供將來執行。愚蠢的例子 - 我有一個單線,能夠使用 Incanter 在圖表中視覺化正在執行的程序中的各種資料結構。如果出現問題,我可以立即以視覺方式查看,僅此一項就為我節省了數週的調試時間……
- 社區——我個人喜歡 Clojure 社區,它規模雖小但發展迅速。它有實用主義(即把事情做好)、樂於助人和關心做好事情的正確組合,我認為這很重要。