Clojure 程式語言使用 true
和 false
來表示邏輯上的真與假:
true
;; => true
false
;; => false
除了 true
以及 false
之外,Clojure 還加入了 nil
表示不存在與虛無。當用在邏輯判斷時,nil
跟 false
被當作邏輯上的假。
符號用來指稱某種東西,例如前面提到的 str
和 +
用來表示函式與運算元。Clojure 類似於其他程式語言用來定義變數的方式,就是使用 def
定義一個符號以及它對應的事物。
(def clojurist "Bob")
;; => #'user/clojurist
clojurist
;; => “Bob”
使用 def
會建立符號 clojurist
連結到 "Bob"
字串。在 REPL 中看到結果 clojurist
加了 user 與斜線 (/),斜線前面的符號指的是 clojurist
的命名空間 (namespace)。在 REPL 中,預設的命名空間是 user
。
關鍵字 (Keyword) 與符號的功能類似,也是標識符號 (Identifier),但是關鍵字必須以冒號 (:) 爲開頭,而且關鍵字不代表其他資料,只代表它自己。通常跟映射 (Map) 搭配使用,作爲映射的索引鍵 (Key)。
:foo
;; => :foo
:bar
;; => :bar
{:Lisp "McCarthy" :Clojure "Hickey"}
;; => {:Lisp "McCarthy", :Clojure "Hickey"}
Clojure 將前面加上井號 (#) 的字串視爲正則表達式,型態爲 Java 中的 java.util.regex.Pattern:
(class #"[0-9A-Za-z]")
;; => java.util.regex.Pattern
正則表達式與內建的函式,如 re-seq
、re-find
與 re-match
一起搭配使用。
當資料變多變雜時,會需要程式語言提供容器將相似的資料整理在一起。Clojure 提供四種群集型態 (Collections):列表 (List)、向量 (Vector)、映射 (Map) 與集合 (Set)。
;; List
'(1 2 3)
;; => (1 2 3)
;; Vector
[1 2 3]
;; => [1 2 3]
;; Map
{:author "Isaac Asimov" :title "I, Robot"}
;; => {:author "Isaac Asimov", :title "I, Robot"}
;; Set
#{1 2 3 4}
;; => #{1 4 2 3}
Clojure 使用空白分隔運算式中的各個元素,主流程式語言中則是使用逗號 (,)。其實也可以使用逗號,它的功能跟空白完全一樣,但是依照編寫的習慣,建議使用空白來區隔元素。逗號通常用來分隔映射裡的元素,以增加可讀性。
{:name "Catherine", :age 40}
以分號 (;) 開頭的文字被視爲單行註解,Clojure 會將它忽略不執行。如果想要撰寫多行註解,可以使用 comment
。
(+ 1 2) ; the result is 3
;; => 3
(comment
I have a dream that one day this nation will rise
up, live out the truth meaning of its creed.)
;; => nil
Clojure 是一個函數式語言,函式的定義與使用至關重要。通常使用 defn
來定義函式:
(defn hello [name]
(str "Hello, " name))
;; => #’user/hello
defn
的第一個參數用來表示函式的名稱,名稱之後則是新定義函數的參數,中括號裡代表各參數的名字,之後便是函式的本體 (Body)。當函式被呼叫時,本體中的表達式將會被求值,所得到的值就是此函式的返回值。
從本篇文章中你已經知道了 Clojure 可以表達的數字類型,還有字串與字符的表達方式;也了解用來判斷邏輯真假的布林型態、指稱事物的符號和關鍵字型態;還知道了四種集合型態:列表、向量、映射與集合。還知道了定義函式的方法。
還不賴吧?今天就先到這裡,下一篇文章再見囉!
(本篇文章同步刊登於 GitHub,歡迎在文章下方留言或發送 PR 給予建議與指教)
想問一下在 Clojure 裏面,
List 和 Vector 的差別是?
類型不同和存取的效能不同,List 元素只知道自己的下一個元素,Vector 則是可以快速地往前或往後一個元素移動。