天天看點

clojure基礎入門(一)

最近在看storm的源碼,就學習分享下clojure文法。

閱讀目錄:

  1. 概述
  2. 變量
  3. 運算符
  4. 流程控制
  5. 總結

clojure是一種運作在JVM上的Lisp方言,屬于函數式程式設計範式,它和java可以友善的互相調用,這樣開發的程式可以很好的結合java和clojure的優點(storm),這跟Net中C#和F#的角色一樣。

安裝java1.6以上的JDK,下載下傳位址。

下載下傳clojure的環境 包,下載下傳位址。

解壓後用指令行進入到clojure目錄下,輸入下面指令進入REPL指令行互動界面:

java -cp clojure-1.7.0.jar clojure.main      
clojure基礎入門(一)

歡迎進入clojure的世界。 

clojure基礎入門(一)

Clojure中的變量可以def關鍵字來聲明: 

clojure基礎入門(一)

clojure資料類型是弱類型,對應java中的object,然後通過變量名直接調用。

類似c#中代碼:

object greet = "Good Morning";
  Console.WriteLine(greet);      

Clojure文法是把代碼元素用小括号形式括起來,以空格來分割元素,使其像填充清單一樣來編寫代碼。

(str "Hello World!")      

函數式程式設計中以函數為第一類對象,其小括号後面第一個元素被Clojure解釋器當成一個函數或宏,其後面的都會被當成參數,如上"hello world"是被當成參數傳入str函數進行輸出。

類似C#代碼:

Console.WriteLine("Hello World!");      

一個變量可以重複指派,也可以是不同類型:

clojure基礎入門(一)

def可以把函數指派給一個變量,函數變量不能直接調用,需要加上括号: 

clojure基礎入門(一)

類似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字元串。加參數後,再次調用需要傳入值,如果不傳會報異常。

clojure基礎入門(一)

下面在函數内部使用a函數參數,如果想要拼接的話,可以在内部使用str函數,用它傳回的值當成Get函數的參數: 

clojure基礎入門(一)

多個參數表示形式:[arg1,arg2]

判斷if

clojure基礎入門(一)

這裡有三層嵌套,首先(= age 18)來判斷傳回是否等于18,作為if判斷該傳回哪個字元串的依據,再根據if确定的字元串作為函數的傳回值。 注意if是不是函數或宏,而是叫做special form(特殊形式),而且沒有else,用空白或換行即表示else,不用顯式return,clojure會将最後一個表示的值作為函數的傳回值。

謂詞函數

謂詞函數是一個判斷式,一個傳回bool值的函數或者仿函數,用來測試條件是否成立。

與或非(and or not):

clojure基礎入門(一)

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裡面的每個操作被實作成以下三種形式:

  •  函數(function)     文中以defn定義的。
  •  宏(macro)           Clojure中幾乎所有的函數和宏都是用Clojure代碼實作的,關于宏後面再說。
  •  special form        文中出現的if就是,其他還包括catch,def,do,dot (‘.’),finally,fn,if,let,loop,monitor-enter,monitor-exit,new,quote,recur,set!,throw,try,var。

部落格園的代碼高亮不支援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

作者:蘑菇先生

出處: http://mushroom.cnblogs.com/

本文版權歸作者和部落格園共有,歡迎轉載。未經作者同意下,必須在文章頁面明顯标出原文連結及作者,否則保留追究法律責任的權利。

如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的

【推薦】

按鈕,因為你的支援是我繼續寫作,分享的最大動力!