Clojure

其他有用函数和宏

创建函数

函数 示例表达式 返回值

fn

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

(3 4 5)

#() 阅读器

(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 以一种可以被阅读器读取的方式打印,而 printprintln 生成供人类阅读的输出。当*print-readably* 不为 nil 时,元数据的打印由*print-meta*控制,其默认为 nil。

打印到*out*: pr prn print println newline
打印到字符串: pr-str prn-str print-str println-str with-out-str

正则表达式支持

正则表达式模式可以通过#"pattern"阅读器宏在读取时编译,或通过 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")