最近在看storm的源碼,就學習分享下clojure語法。html
閱讀目錄:java
clojure是一種運行在JVM上的Lisp方言,屬於函數式編程範式,它和java能夠方便的互相調用,這樣開發的程序能夠很好的結合java和clojure的優勢(storm),這跟Net中C#和F#的角色同樣。編程
安裝java1.6以上的JDK,下載地址。
下載clojure的環境 包,下載地址。
解壓後用命令行進入到clojure目錄下,輸入下面命令進入REPL命令行交互界面: c#
java -cp clojure-1.7.0.jar clojure.main
歡迎進入clojure的世界。 segmentfault
Clojure中的變量能夠def關鍵字來聲明: oracle
clojure數據類型是弱類型,對應java中的object,而後經過變量名直接調用。app
相似c#中代碼: ide
object greet = "Good Morning"; Console.WriteLine(greet);
Clojure語法是把代碼元素用小括號形式括起來,以空格來分割元素,使其像填充列表同樣來編寫代碼。函數式編程
(str "Hello World!")
函數式編程中以函數爲第一類對象,其小括號後面第一個元素被Clojure解釋器當成一個函數或宏,其後面的都會被當成參數,如上"hello world"是被當成參數傳入str函數進行輸出。函數
相似C#代碼:
Console.WriteLine("Hello World!");
一個變量能夠重複賦值,也能夠是不一樣類型:
def能夠把函數賦值給一個變量,函數變量不能直接調用,須要加上括號:
相似c#代碼:
Action func = () => { Console.WriteLine("Hello World"); }; func();
clojure使用前置運算符,分號(;)表示後面跟的是註釋。
加減乘除:
(+ 1 1) ; => 2 (- 2 1) ; => 1 (* 1 2) ; => 2 (/ 2 1) ; => 2
增量,接受一個數值加1後範圍,相似C#中的i++。
(inc 5) ;=>6
減量:
(dec 5) ;=>4
求商函數:
(quot 5 2) ;=>2
求餘函數:
(quot 5 2) ;=>1
小於(<):
(< 5 6) ;=>true
小於等於 (<=):
(<= 5 5) ;true
大於(>):
(> 8 5) ;=>true
大於等於 (>=) :
(<= 5 5) ;true
等號 =
(= 1 1) ; => true (= 2 1) ; => false (= 1 "1") ;=> false
一樣的把前置運算符理解爲函數,後面爲參數。
clojure中以函數爲第一類對象,其小括號後面第一個元素被Clojure解釋器當成一個函數或宏,其後面的都會被當成參數。 定義函數用defn,跟定義變量的def相似:
(defn Get [] "Hello World") ;=>"Hello World"
下面定義了get函數,中括號爲函數的參數,輸出Hello World字符串。加參數後,再次調用須要傳入值,若是不傳會報異常。
下面在函數內部使用a函數參數,若是想要拼接的話,能夠在內部使用str函數,用它返回的值當成Get函數的參數:
多個參數表示形式:[arg1,arg2]
這裏有三層嵌套,首先(= age 18)來判斷返回是否等於18,做爲if判斷該返回哪一個字符串的依據,再根據if肯定的字符串做爲函數的返回值。 注意if是否是函數或宏,而是叫作special form(特殊形式),並且沒有else,用空白或換行即表示else,不用顯式return,clojure會將最後一個表示的值做爲函數的返回值。
謂詞函數是一個判斷式,一個返回bool值的函數或者仿函數,用來測試條件是否成立。
與或非(and or not):
clojure中(lisp習慣)有個規定:對於判斷功能的函數,函數名後面都有一個「?」號。因此只要看到後面帶問號的函數名,就知道這必定是一個判斷語句。
user=> (fn? quot) ;判斷quot是否是一個函數true
user=> (fn? 1) ;判斷1是否是一個函數 false
測試一個對象的類型的謂詞:class?,coll?,decimal?,delay?,float?,fn?,instance?,integer?,isa?,keyword?,list?,macro?,map?,number?,seq?,set?,string?,vector?。
測試兩個值之間關係的謂詞有:<,<=,=,not=,==,>,>=,compare,distinct? , identical?。
測試邏輯關係的謂詞有:and,or,not,true?,false?,nil?。
測試數字的謂詞有:even?,neg?,odd?,pos?,zero?。
Clojure裏面的每一個操做被實現成如下三種形式:
博客園的代碼高亮不支持Clojure。
[0] http://clojure.org/ [1] http://xumingming.sinaapp.com/302/ [2] http://huangz.iteye.com/blog/1325228 [3] http://segmentfault.com/a/1190000000414279#articleHeader0