Clojure

參考手冊

Clojure 1.11 參考手冊 (v54)

下載 PDF 版本 / 原始碼存放庫

非常感謝 Steve Tayon 撰寫此手冊,以及 Andy Fingerhut 持續維護。

文件

clojure.repl/ doc find-doc apropos dir source pst javadoc (foo.bar/ 是稍後符號的命名空間)

基本型別

數字

文字 Long:7,十六進制 0xff,八進制 017,二進制 2r1011,三十六進制 36rCRAZY BigInt:7N Ratio:-22/7 Double:2.78 -1.2e-5 BigDecimal:4.2M
算術 + - * / quot rem mod inc dec max min +' -' *' inc' dec' (1.11) abs
比較 == < > <= >= compare
位元 bit-and bit-or bit-xor bit-not bit-flip bit-set bit-shift-right bit-shift-left bit-and-not bit-clear bit-test unsigned-bit-shift-right (請參閱 BigInteger,以取得比 Long 還要大的整數)
轉型 byte short int long float double bigdec bigint num rationalize biginteger
測試 zero? pos? neg? even? odd? number? rational? integer? ratio? decimal? float? (1.9) double? int? nat-int? neg-int? pos-int? (1.11) NaN? infinite?
隨機 rand rand-int
BigDecimal with-precision
Unchecked *unchecked-math* unchecked-add unchecked-dec unchecked-inc unchecked-multiply unchecked-negate unchecked-subtract

字串

建立 str format "a string" "escapes \b\f\n\t\r\" octal \377 hex \ucafe" 另請參閱 IO/to string 區段
使用 count get subs compare (clojure.string/) join escape split split-lines replace replace-first reverse index-of last-index-of (1.11) (clojure.core/) parse-boolean parse-double parse-long parse-uuid
Regex #"pattern" re-find re-seq re-matches re-pattern re-matcher re-groups (clojure.string/) replace replace-first re-quote-replacement Note: \ in #"" is not escape char. (re-pattern "\\s*\\d+") can be written #"\s*\d+"
字母 (clojure.string/) capitalize lower-case upper-case
修剪 (clojure.string/) trim trim-newline triml trimr
測試 string? (clojure.string/) blank? starts-with? ends-with? includes?

其他

字元 char char? char-name-string char-escape-string 文字: \a \newline(更多資訊請參閱連結)
關鍵字 keyword keyword? find-keyword 文字: :kw :my.name.space/kw ::in-cur-namespace ::namespace-alias/kw
符號 symbol symbol? gensym 文字: my-sym my.ns/foo
雜項 文字: true false nil

集合

集合

一般操作 count empty not-empty into conj (clojure.walk/) walk prewalk prewalk-demo prewalk-replace postwalk postwalk-demo postwalk-replace (1.9) bounded-count
內容測試 distinct? empty? every? not-every? some not-any?
功能 sequential? associative? sorted? counted? reversible?
類型測試 coll? list? vector? set? map? seq? record? map-entry?

清單(連接、彈出和偷看開頭)

建立 () list list*
檢查 first nth peek .indexOf .lastIndexOf
「變更」 cons conj rest pop

向量(連接、彈出和偷看尾端)

建立 [] vector vec vector-of mapv filterv
檢查 (my-vec idx)( nth my-vec idx) get peek .indexOf .lastIndexOf
「變更」 assoc assoc-in pop subvec replace conj rseq update update-in
運算 reduce-kv

集合

建立未排序集合 #{} set hash-set
建立已排序集合 sorted-set sorted-set-by (clojure.data.avl/) sorted-set sorted-set-by (flatland.ordered.set/) ordered-set (clojure.data.int-map/) int-set dense-int-set
檢查 (my-set item)( get my-set item) contains?
「變更」 conj disj
集合運算 (clojure.set/) union difference intersection select 另請參閱關係部分
測試 (clojure.set/) subset? superset?
已排序集合 rseq subseq rsubseq

映射

建立未排序集合 {} hash-map array-map zipmap bean frequencies group-by (clojure.set/) index
建立已排序集合 sorted-map sorted-map-by (clojure.data.avl/) sorted-map sorted-map-by (flatland.ordered.map/) ordered-map (clojure.data.priority-map/) priority-map (flatland.useful.map/) ordering-map (clojure.data.int-map/) int-map
檢查 (my-map k)( get my-map k) 還有 (:key my-map)( get my-map :key) get-in contains? find keys vals
「變更」 assoc assoc-in dissoc merge merge-with select-keys update update-in (clojure.set/) rename-keys map-invert (1.11) (clojure.core/) update-keys update-vals GitHub: Medley
運算 reduce-kv
項目 key val
已排序的映射 rseq subseq rsubseq

佇列(在結尾處連接,從開頭窺視和彈出)

建立 clojure.lang.PersistentQueue/EMPTY(沒有文字語法或建構函數 fn)
檢查 窺視
「變更」 conj pop

關係(一組映射,每個映射具有相同的鍵,又稱 rels)

關係代數 (clojure.set/) join select project union difference intersection index rename

暫態 (clojure.org/reference/transients)

建立 transient persistent!
變更 conj! pop! assoc! dissoc! disj! 注意:永遠使用回傳值進行後續的變更,切勿使用原始值!

雜項

比較 = identical? not= not compare clojure.data/diff
測試 true? false? instance? nil? some?

IO

轉換 ... spit slurp(轉換為 writer/reader、Socket、包含檔名的字串、URI 等)
轉換為 *out* pr prn print printf println newline (clojure.pprint/) print-table
轉換為 writer (clojure.pprint/) pprint cl-format 還有:(binding [*out* writer] ...)
轉換為字串 format with-out-str pr-str prn-str print-str println-str
從 *in* read-line (clojure.edn/) read (clojure.tools.reader.edn/) read
來自讀取器 line-seq (clojure.edn/) read (clojure.tools.reader.edn/) read 還有:(binding [*in* reader] ...) java.io.Reader
從字串 with-in-str (clojure.edn/) read-string (clojure.tools.reader.edn/) read-string
開啟 with-open (clojure.java.io/) text: reader writer binary: input-stream output-stream
二進制 (.write ostream byte-arr) (.read istream byte-arr) java.io.OutputStream java.io.InputStream GitHub: gloss byte-spec
雜項 flush (.close s) file-seq *in* *out* *err* (clojure.java.io/) file copy delete-file resource as-file as-url as-relative-path GitHub: fs
資料讀取器 default-data-readers *default-data-reader-fn*
tap (1.10) tap> add-tap remove-tap

抽象化 (Clojure 類型選取流程圖)

協定 (clojure.org/reference/protocols)

定義 ( 延伸 ( extend-type String Slicey (slice [at] ...))
延伸 null ( extend-type nil Slicey (slice [_] nil))
Reify ( reify Slicey (slice [at] ...))
測試 satisfies? extends?
其他 extend extend-protocol extenders

記錄 (clojure.org/reference/datatypes)

定義 ( defrecord Pair [h t])
存取 (:h (Pair. 1 2))1
建立 Pair. ->Pair map->Pair
測試 record?

類型 (clojure.org/reference/datatypes)

定義 ( deftype Pair [h t])
存取 (.h (Pair. 1 2))1
建立 Pair. ->Pair
有方法 ( deftype Pair [h t]
  Object
  (toString [this] (str "<" h "," t ">")))

多重方法 (clojure.org/reference/multimethods)

定義 ( defmulti my-mm dispatch-fn)
方法定義 ( defmethod my-mm :dispatch-value [args] ...)
分派 get-method methods
移除 remove-method remove-all-methods
偏好 prefer-method prefers
關係 derive underive isa? parents ancestors descendants make-hierarchy

資料化 (文章)

Datafy (clojure.datafy/) datafy nav

特殊字元 (clojure.org/reference/reader指南)

, 逗號讀取為空白。通常用於映射鍵/值對之間,以提高可讀性。
' quote: 'form( quote form)
/ 命名空間分隔符號(請參閱基本類型/其他部分)
\ 字元字面值(請參閱基本類型/其他部分)
: 關鍵字(請參閱基本類型/其他部分)
; 單行註解
^ 元資料(請參閱元資料部分)
*foo* 'earmuffs' - 表示 動態變數 的慣例,如果沒有動態,編譯器會發出警告
@ Deref:@form( deref form)
` 語法引號
foo# 'auto-gensym',在同一個 `( ... )` 內部,始終替換為同一個自動產生的符號
~ 取消引號
~@ 取消引號拼接
-> 'thread first' 巨集 ->
->> 'thread last' 巨集 ->>
>!! <!! >! <! core.async 通道巨集 >!! <!! >! <!
( 清單文字 (見集合/清單區段)
[ 向量文字 (見集合/向量區段)
{ 映射文字 (見集合/映射區段)
#' 變數引號:#'x( var x)
#" #"p" 讀取為正規表示法模式 p (見字串/正規表示法區段)
#{ 集合文字 (見集合/集合區段)
#( 匿名函式文字#(...)(fn [args] (...))
% 匿名函式引數%N 是匿名函式引數 N 的值。%%1 的簡寫。%& 為剩餘引數。
#? 讀取條件#?(:clj x :cljs y) 在 JVM 上讀取為 x,在 ClojureScript 中讀取為 y,在其他地方則不讀取。其他鍵::cljr :default
#?@ 拼接讀取條件[1 #?@(:clj [x y] :cljs [w z]) 3] 在 JVM 上讀取為 [1 x y 3],在 ClojureScript 中讀取為 [1 w z 3],在其他地方則讀取為 [1 3]
#foo 標記文字,例如:#inst #uuid
#: 映射命名空間語法,例如:#:foo{:a 1} 等於 {:foo/a 1}
## (1.9) 符號值:##Inf ##-Inf ##NaN
$ JavaContainerClass$InnerClass
foo? 謂詞的慣用結尾,例如: zero? vector? instance?(未強制執行)
foo! 不安全操作的慣用結尾,例如: set! swap! alter-meta!(未強制執行)
_ 未使用的值的慣用名稱(未強制執行)
#_ 忽略下一個表單

元資料 (clojure.org/reference/readerspecial_forms)

一般 ^{:key1 val1 :key2 val2 ...}
縮寫 ^Type^{:tag Type}
^:key^{:key true}
常見 ^:dynamic ^:private ^:doc ^:const
範例 (defn ^:private ^String my-fn ...)
(def ^:dynamic *dyn-var* val)
在變數上 meta with-meta vary-meta alter-meta! reset-meta! doc find-doc test

載入

載入函式庫 (tutorial) require use import refer
載入清單 loaded-libs
載入雜項 load load-file load-reader load-string