iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
0
Software Development

擁抱 Clojure系列 第 3

[第 03 天] 擁抱 Clojure:基本組成(二)

基本組成(二)

資料型態

布林

Clojure 程式語言使用 truefalse 來表示邏輯上的真與假:

true
;; => true
false
;; => false

除了 true 以及 false 之外,Clojure 還加入了 nil 表示不存在與虛無。當用在邏輯判斷時,nilfalse 被當作邏輯上的假。

符號

符號用來指稱某種東西,例如前面提到的 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-seqre-findre-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 給予建議與指教)


上一篇
[第 02 天] 擁抱 Clojure:基本組成(一)
下一篇
[第 04 天] 擁抱 Clojure:資料結構與型態(一)
系列文
擁抱 Clojure30

1 則留言

0
M157q
iT邦新手 5 級 ‧ 2017-12-25 01:41:48

想問一下在 Clojure 裏面,
List 和 Vector 的差別是?

林萌 iT邦新手 5 級‧ 2017-12-25 02:25:35 檢舉

類型不同和存取的效能不同,List 元素只知道自己的下一個元素,Vector 則是可以快速地往前或往後一個元素移動。

我要留言

立即登入留言