Clojure

其他有用的函數和巨集

建立函數

函數 範例表達式 傳回值

fn

(map (fn [x] (+ 2 x)) [1 2 3])

(3 4 5)

#() reader 巨集

(map #(+ 2 %) [1 2 3])

(3 4 5)

partial

(map (partial + 2) [1 2 3])

(3 4 5)

comp

(map (comp - *) [2 4 6] [1 2 3])

(-2 -8 -18)

complement

(map (complement zero?) [3 2 1 0])

(true true true false)

constantly

(map (constantly 9) [1 2 3])

(9 9 9)

列印

提供多個函式,將物件列印到目前 *out* 值的輸出串流。-str 版本會將 *out* 繫結到 StringWriter,列印到該物件,並傳回產生的字串。 pr 會列印物件(如果有多個物件,則以空白分隔)。 prn 會執行相同動作,並在後面加上 換行printprintln 分別呼叫 prprn,並將 *print-readably*(預設為 true)繫結到 nil,這會讓字串在列印時不加上引號或任何逸出字元編碼,而字元在列印時也不會加上開頭的 '\' 或任何逸出字元編碼。預設情況下, prprn 會以讓 reader 能夠讀取物件的方式列印,而 printprintln 會產生供人類閱讀的輸出。當 *print-readably* 為非 nil 時,會由預設為 nil 的 *print-meta* 切換列印的元資料。

列印到 *out*pr prn print println 換行
列印到字串: pr-str prn-str print-str println-str with-out-str

Regex 支援

Regex 樣式可透過 #"樣式" 讀取巨集在執行階段編譯,或在執行階段使用 re-pattern 編譯。這兩種形式都會產生 java.util.regex.Pattern 物件。

user=> (re-seq #"[0-9]+" "abs123def345ghi567")
("123" "345" "567")
user=> (re-find #"([-+]?[0-9]+)/([0-9]+)" "22/7")
["22/7" "22" "7"]
user=> (let [[a b c] (re-matches #"([-+]?[0-9]+)/([0-9]+)" "22/7")]
         [a b c])
["22/7" "22" "7"]
user=> (re-seq #"(?i)[fq].." "foo bar BAZ QUX quux")
("foo" "QUX" "quu")