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-math* unchecked-add unchecked-dec unchecked-inc unchecked-multiply unchecked-negate unchecked-subtract

字符串

创建 str format "a string" "转义字符 \b\f\n\t\r\" 八进制 \377 十六进制 \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
正则表达式 #"pattern" re-find re-seq re-matches re-pattern re-matcher re-groups (clojure.string/) replace replace-first re-quote-replacement 注意:#"" 中的 \ 不是转义字符。(re-pattern "\\s*\\d+") 可以写成 #"\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?

列表 (conj, pop, & peek 在开头)

创建 () list list*
检查 first nth peek .indexOf .lastIndexOf
'改变' cons conj rest pop

向量 (conj, pop, & peek 在结尾)

创建 [] 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(没有字面语法或构造函数)
检查 peek
'改变' conj pop

关系(一组映射,每个映射具有相同的键,也称为关系)

关系代数 (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

to/from ... spit slurp (to writer/from reader,Socket,带有文件名的字符串,URI 等等)
to *out* pr prn print printf println newline (clojure.pprint/) print-table
to writer (clojure.pprint/) pprint cl-format 另外: (binding [*out* writer] ...)
to string format with-out-str pr-str prn-str print-str println-str
from *in* read-line (clojure.edn/) read (clojure.tools.reader.edn/) read
from reader line-seq (clojure.edn/) read (clojure.tools.reader.edn/) read 另外: (binding [*in* reader] ...) java.io.Reader
from string with-in-str (clojure.edn/) read-string (clojure.tools.reader.edn/) read-string
Open 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
数据读取器 *data-readers* default-data-readers *default-data-reader-fn*
tap (1.10) tap> add-tap remove-tap

抽象 (Clojure 类型选择流程图)

协议 (clojure.org/reference/protocols)

定义 ( defprotocol Slicey (slice [at]))
扩展 ( 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 (文章)

Datafy (clojure.datafy/) datafy nav

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

, 逗号被解读为空格。通常用于 map 的键值对之间,以提高可读性。
' 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/reader, special_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

加载

加载库 (教程) require use import refer
列出已加载的 loaded-libs
加载其他 load load-file load-reader load-string