めだかのclojure.core学校
https://scrapbox.io/files/674439ffa85bcfeaa55d541e.png
執筆にあたっては clojure.core に存在する 662 もの Var を分類し、動作例とともに丁寧に説明をしています。
clojure.core は全ての名前空間に自動でインポートされるという意味で特別であり、まず clojure.core で何が提供されているのか理解することが Clojure に慣れることの第一歩だと思っています。
筆者は Clojure を短時間で習得するために、まず clojure.core を理解することが最重要と思い、その整理の副産物として生まれたのが本書です。
radish-miyazaki.icon
目次
2. Functions
3. Abstructions
4. States
5. Concurrency
6. Clojure
7. References
序章
662 もの Var
code:clj
(def index (read-string (slurp url))))
user=> (-> index
:vars
(->> (filter #(= "clojure.core" (:namespace %))) (group-by :var-type)
(#(update-vals % count))
(sort-by val)
reverse))
引数を受け取り、それぞれの処理を行い結果を返す
macro: 関数だが、引数が 評価 されずに渡される これにより、引数の評価順を変更したり、評価される環境を変更するといった機能が実現可能
special form: 言語が提供する マクロ なぜこんなに多くの API が用意されているのか?
Clojure では以下の考え方に則って API が用意されており、データ構造に属した操作が定義されているのではなく、データ構造と操作は独立して定義されている
"It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures."
(1 つのデータ構造に対して 100 個の関数を操作させる方が、10 個のデータ構造に対して 10 個の関数を操作させるよりも良い。)
-- Alan J. Perlis
Clojure のデータ構造
1. nil
2. Numbers
3. Strings
4. Characters
5. Keyword`
6. Symbols
7. Collections
8. Lists (IPersistentList)
9. Vectors (IPersistentMap)
10. StructMaps
11. ArrayMaps
12. Sets
Primitives
Numbers
Strings
Other
Characters, Keywords, Symbols, Misc, Booleans, nil
Collections
Lists, Vectors, Sets, Maps
Functions
Abstructions
Protocols, Records, Types, Multimethods
Macros
Metadata
Transients
Sequences
Lazy Seq, Seq in, Seq out, Using seq
Transducers
IO
Special Forms
Vars and global environment
Namespace
Loading
Concurrency
Atoms, Futures, Threads, Volatiles
Refs
Agents
Java interop
Arrays, Proxy
Clojure で利用されている、clojure.lang.IPersistentVector と clojure.lang.IPersistentList、clojure.lang.IPersistentMap、clojure.lang.IPersistentSet から辿れるインタフェース
https://scrapbox.io/files/674458d9b3809e29e09b7320.png
ただし、clojure.lang.Iseq は clojure.lang.Seqable から seq メソッドで変換できる重要なインタフェースでであるため特別に図示
上記を踏まえて分離すると、以下のようになる
Data Structure
Not Collections / Sequences
Numbers
Ident
Keywords, Symbols
Booleans
nil
Characters
Collections
Lists, Vectors, Sets, Maps, Strings
Sequences
Functions
Abstructions
Protocols, Records, Types, Multimethods
States
Ref, Atom, Agent, Var
Concurrency
Atoms, Futures, Threads, Votatiles
Clojure
Lisp
Macro
Java interop
Array, Proxy
Namespace
Loading
Metadata
IO