<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## Clojure概述 Clojure是一個動態類型的,運行在JVM(JDK5.0以上),并且可以和java代碼互操作的函數式語言。這個語言的主要目標之一是使得編寫一個有多個線程并發訪問數據的程序變得簡單。 Clojure的發音和單詞closure是一樣的。Clojure之父是這樣解釋Clojure名字來歷的 “我想把這就幾個元素包含在里面: C (C#), L (Lisp) and J (Java). 所以我想到了 Clojure, 而且從這個名字還能想到closure;它的域名又沒有被占用;而且對于搜索引擎來說也是個很不錯的關鍵詞,所以就有了它了.” 很快Clojure就會移植到.NET平臺上了. ClojureCLR是一個運行在Microsoft的CLR的Clojure實現. 在我寫這個入門教程的時候ClojureCLR已經處于alpha階段了. 在2011年7月, ClojureScript項目開始了,這個項目把Clojure代碼編譯成Javascript代碼:看這里 [https://github.com/clojure/clojurescript](https://github.com/clojure/clojurescript) . Clojure是一個開源語言, licence: [Eclipse Public License v 1.0](http://www.eclipse.org/legal/epl-v10.html) (EPL). This is a very liberal license. 關于EPL的更多信息看這里: [http://www.eclipse.org/legal/eplfaq.php](http://www.eclipse.org/legal/eplfaq.php) . 運行在JVM上面使得Clojure代碼具有可移植性,穩定性,可靠的性能以及安全性。同時也使得我們的Clojure代碼可以訪問豐富的已經存在的java類庫:文件 I/O, 多線程, 數據庫操作, GUI編程, web應用等等等等. Clojure里面的每個操作被實現成以下三種形式的一種: 函數(function), 宏(macro)或者special form. 幾乎所有的函數和宏都是用Clojure代碼實現的,它們的主要區別我們會在后面解釋。Special forms不是用clojure代碼實現的,而且被clojure的編譯器識別出來. special forms的個數是很少的, 而且現在也不能再實現新的special forms了. 它們包括: [catch](http://clojure.org/special_forms#try) , [def](http://clojure.org/special_forms#toc1) , [do](http://clojure.org/special_forms#toc3) , [dot](http://clojure.org/java_interop#dot) (‘.’), [finally](http://clojure.org/special_forms#try) , [fn](http://clojure.org/special_forms#toc7) , [if](http://clojure.org/special_forms#toc2) , [let](http://clojure.org/special_forms#toc4) , [loop](http://clojure.org/special_forms#toc9) , [monitor-enter](http://clojure.org/special_forms#toc13) , [monitor-exit](http://clojure.org/special_forms#toc14) , [new](http://clojure.org/java_interop#new) , [quote](http://clojure.org/special_forms#toc5) , [recur](http://clojure.org/special_forms#toc10) , [set!](http://clojure.org/java_interop#set) , [throw](http://clojure.org/special_forms#try) , [try](http://clojure.org/special_forms#try) 和 [var](http://clojure.org/special_forms#toc6) . Clojure提供了很多函數來操作序列(sequence), 而序列是集合的邏輯視圖。很多東西可以被看作序列:Java集合, Clojure的集合, 字符串, 流, 文件系統結構以及XML樹. 從已經存在的clojure集合來創建新的集合的效率是非常高的,因為這里使用了 [persistent data structures](http://en.wikipedia.org/wiki/Persistent_data_structure) 的技術(這對于clojure在數據不可更改的情況下,同時要保持代碼的高效率是非常重要的)。 Clojure提供三種方法來安全地共享可修改的數據。所有三種方法的實現方式都是持有一個可以開遍的引用指向一個不可改變的數據。Refs通過使用 [Software Transactional Memory](http://en.wikipedia.org/wiki/Software_transactional_memory) (STM)來提供對于多塊共享數據的同步訪問。Atoms提供對于單個共享數據的同步訪問。Agents提供對于單個共享數據的異步訪問。這個我們會在 “引用類型”一節詳細討論。 Clojure是 [Lisp](http://en.wikipedia.org/wiki/Lisp_(programming_language)) 的一個方言. 但是Clojure對于傳統的Lisp有所發展。比如, 傳統Lisp使用 `car` 來獲取鏈表里面的第一個數據。而Clojure使用 `first。有關更多Clojure和Lisp的不同看這里:` [http://clojure.org/lisps](http://clojure.org/lisps) . Lisp的語法很多人很喜歡,很多人很討厭, 主要因為它大量的使用圓括號以及前置表達式. 如果你不喜歡這些,那么你要考慮一下是不是要學習Clojure了 。許多文件編輯器以及IDE會高亮顯示匹配的圓括號, 所以你不用擔心需要去人肉數有沒有多加一個左括號,少寫一個右括號. 同時Clojure的代碼還要比java代碼簡潔. 一個典型的java方法調用是這樣的: ``` methodName(arg1, arg2, arg3); ``` 而Clojure的方法調用是這樣的: ``` (function-name arg1 arg2 arg3) ``` 左括號被移到了最前面;逗號和分號不需要了. 我們稱這種語法叫: “form”. 這種風格是簡單而又美麗:Lisp里面所有東西都是這種風格的.要注意的是clojure里面的命名規范是小寫單詞,如果是多個單詞,那么通過中橫線連接。 定義函數也比java里面簡潔。Clojure里面的 `println` 會在它的每個參數之間加一個空格。如果這個不是你想要的,那么你可以把參數傳給 `str` ,然后再傳給 `println` . ``` // Java public void hello(String name) { System.out.println("Hello, " + name); } ``` ``` ; Clojure (defn hello [name] (println "Hello," name)) ``` Clojure里面大量之用了延遲計算. 這使得只有在我們需要函數結果的時候才去調用它. “懶惰序列” 是一種集合,我們之后在需要的時候才會計算這個集合理解面的元素. 只使得創建無限集合非常高效. 對Clojure代碼的處理分為三個階段:讀入期,編譯期以及運行期。在讀入期,讀入期會讀取clojure源代碼并且把代碼轉變成數據結構,基本上來說就是一個包含列表的列表的列表。。。。在編譯期,這些數據結構被轉化成java的bytecode。在運行期這些java bytecode被執行。函數只有在運行期才會執行。而宏在編譯期就被展開成實際對應的代碼了。 Clojure代碼很難理解么?想想每次你看到java代碼里面那些復雜語法比如: `if` , `for` , 以及匿名內部類, 你需要停一下來想想它們到底是什么意思(不是那么的直觀),同時如果想要做一個高效的Java工程師,我們有一些工具可以利用來使得我們的代碼更容易理解。同樣的道理,Clojure也有類似的工具使得我們可以更高效的讀懂clojure代碼。比如: `let` , `apply` , `map` , `filter` , `reduce` 以及匿名函數 … 所有這些我們會在后面介紹.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看