Clojure 的字串即是 Java 的 String 類型,表現方法也跟 Java 一樣用雙引號包住文字:
(class "foo")
;; => java.lang.String
多行字串只要在需要的時候換行即可:
"This multi-
line string"
;; => "This multi-\nline string"
字符是字串的組成元素,使用方法爲將反斜線 (\) 加到文字的前面,型態爲 java.lang.Character:
(class \j)
;; => java.lang.Character
\j
;; => \j
萬國碼 (Unicode) 以及八進位表示法也可以用在字符表示上:
\u00eb
;; => \ë
\o44
;; => \$
請注意,八位元字符最前面加上的是反斜線 (\) 與小寫字母 o (Octal),並不是數字 0。
當運算式使用到流程控制時,需要使用布林型態來決定該往那個分支進行。Clojure 的布林型態有 true
以及 false
兩種。內部型態爲 Java 的 java.lang.Boolean:
(class true)
;; => java.lang.Boolean
true
;; => true
false
;; => false
Clojure 提供了一些函式用來判斷是否爲真:
(true? true)
;; => true
(true? false)
;; => false
在 Clojure 的命名習慣裡,會將一個返回真假值的函式,在名稱後面加上問號 (?)。這樣的函式稱做「述詞函式」 (Predicate)。
Clojure 也提供了一些函式判斷是否爲假:
(false? false)
;; => true
(false? true)
;; => false
除了布林型態之外,nil
用來表示不存在以及虛無,與 Java 中的 null 相同。當 nil
用在條件判斷時,nil
被當作 false
:
(true? nil)
;; => false
(false? nil)
;; => false
(nil? nil)
;; => true
Clojure 使用 =
來判斷兩個事物是否相等,內部使用 Java 物件的 equals 方法來判斷:
(= 1 1)
;; => true
(= "Hello" "HELLO")
;; => false
(= "Hello" 1)
;; false
符號 (Symbol) 是個標識符 (Identifier),用來指向它所代表的值。對它求值時,會返回它指向的值。在 Clojure 中,所有非數字開頭的名稱都是一個個符號,分別代表數字、字串、集合或函式,每個符號都隸屬於一個命名空間。內部使用的型態爲 clojure.lang.Symbol:
(def username "Rich")
;; => #'user/username
username
;; => "Rich"
(class 'username)
;; => clojure.lang.Symbol
在運算式中直接使用符號,Clojure 會嘗試對它求值,如果這個符號尚未指向任何資料,就會出現例外。所以需要在符號前面加上單引號 (‘),告訴 Clojure 這個符號不需要求值。
(class average)
;; => CompilerException java.lang.RuntimeException: Unable to resolve symbol: average in this context
(class 'average)
;; => clojure.lang.Symbol
你可以使用 symbol
函式創建一個符號:
(symbol "foo")
;; => foo
(symbol "foo" "bar")
;; => foo/bar
關鍵字 (Keyword) 跟符號一樣,是個標識符,但是跟符號不同的是,關鍵字並不指向任何資料,關鍵字被求值時,返回的仍是被求值的關鍵字,關鍵字只代表自己。命名時在名稱前加上冒號 (:),內部使用的資料型態爲 clojure.lang.Symbol:
(class :foo)
;; => clojure.lang.Symbol
:foo
;; => :foo
你可以使用 keyword
函式創建一個關鍵字:
(keyword "foo")
;; => :foo
關鍵字常見的使用方法是跟映射 (Map) 搭配使用,作爲映射的索引鍵。
(未完待續)