Clojure, The Essential Reference
Renzo Borgatti
  • ISBN 9781617293580
  • 625 pages (estimated)
  • printed in black & white

The Clojure standard library is a treasure trove of functions and macros that have been battle-tested over the years to solve the most challenging programming problems. Knowing what's available in the standard library not only liberates programmers from mundane tasks like connecting to data sources, parsing XML, dealing with numbers but also more advanced problems like handling concurrency and parallelism. Having a deep knowledge of the Clojure standard library helps you solve problems quickly and more efficiently.

Clojure, The Essential Reference is an extensive reference to the standard library but it doesn't read as a dull list of functions. In addition to providing clear explanations for each topic, this guide is full of real-world examples, links, and background information. The book approaches difficult topics by illustrating them in a readable and pleasant way, using visual structure to emphasize the essential information. The book is designed to be used as a reference, but each function provides an interesting reading on its own, offering insight into functional and general programming. By using this reference, you will be able to make the most idiomatic and efficient choice while developing a Clojure application.

Table of Contents detailed table of contents

Part 1: Introduction

1 Know Your Tools

1.1 Why should I care about the Standard Library?

1.2 Aren’t specifications just plain boring?

1.3 The different versions of Clojure

1.4 The Clojure Standard Library

1.5 Making Your Development Life Easier

1.6 The problem of fragmented information

1.7 The well kept secret of the Clojure Ninja

1.8 The perfect companion book

1.9 Summary

Part 2: Fundamentals

2 Creating and manipulating functions

2.1 Function definition

2.1.1 defn and defn-

2.1.2 fn

2.1.3 fn and destructuring

2.1.4 fn*

2.2 Higher order functions

2.2.1 fnil

2.2.2 comp

2.2.3 complement

2.2.4 constantly

2.2.5 identity

2.2.6 juxt

2.2.7 memfn

2.2.8 partial

2.2.9 every-pred

2.2.10 some-fn

2.3 Threading macros

2.3.1 ->

2.3.2 ->>

2.3.3 as->

2.3.4 cond->

2.3.5 cond->>

2.3.6 some->

2.3.7 some->>

2.4 Function execution

2.4.1 apply

2.4.2 memoize

2.4.3 trampoline

3 Basic Constructs

3.1 Lexical Binding

3.1.1 let and let*

3.1.2 if-let, when-let, if-some and when-some

3.2 letfn and letfn*

3.3 Boolean and Bit-wise Operators

3.3.1 not

3.3.2 and, or

3.3.3 bit-and and bit-or

3.4 Conditional Branching

3.4.1 if, if-not, when and when-not

3.4.2 cond

3.4.3 condp

3.4.4 case

3.5 Iteration and loops

3.5.1 loop, recur and loop*

3.5.2 range

3.5.3 for

3.5.4 while

3.5.5 dotimes

3.6 A Glimpse of Collection Processing

3.6.1 first, second and last

3.6.2 map and map-indexed

3.6.3 filter and remove

3.6.4 reduce and reductions

4 Creating and inspecting macros

4.1 defmacro

4.2 macroexpand, macroexpand-1 and macroexpand-all

4.3 quote

4.4 gensym

4.5 definline

4.6 destructure

4.7 clojure.template/apply-template

4.8 clojure.template/do-template

5 Operations on Numbers

5.1 +, -, * and /

5.2 inc and dec

5.3 quot, rem and mod

5.4 max and min

5.5 max-key and min-key

5.6 rand and rand-int

5.7 with-precision

5.8 +', -', *', inc' and dec'

5.9 unchecked-add, unchecked-subtract, unchecked-multiply, unchecked-inc, unchecked-dec and unchecked-negate

5.10 unchecked-add-int, unchecked-add-int, unchecked-subtract-int, unchecked-multiply-int, unchecked-divide-int, unchecked-inc-int, unchecked-dec-int, unchecked-negate-int and unchecked-remainder-int

6 Comparison and Equality

6.1 = (equal) and not= (not equal)

6.2 == (double equal)

6.3 < (less than), > (more than), <= (less than or equal) ( and >= (more than or equal)

6.4 compare

6.5 identical?

6.6 hash

6.7 clojure.data/diff

Part 3: Data Structures

7 Reducers and Transducers

7.1 Reducers

7.1.1 fold

7.1.2 reducer and folder

7.1.3 monoid

7.1.4 foldcat, cat and append!

7.2 Transducers

7.2.1 transduce

7.2.2 eduction

7.2.3 completing

7.2.4 cat

7.3 reduced, reduced?, ensure-reduced, unreduced

8 Collections

8.1 Basics

8.1.1 into

8.1.2 count

8.1.3 nth

8.1.4 empty

8.1.5 every?, not-every?, some and not-any?

8.1.6 empty? and not-empty

8.2 Polymorphic

8.2.1 conj

8.2.2 get

8.2.3 contains?

8.3 General purpose

8.3.1 rand-nth

8.3.2 shuffle

8.3.3 random-sample

8.3.4 frequencies

8.3.5 sort and sort-by

8.3.6 group-by

8.3.7 partition, partition-all and partition-by

8.3.8 flatten

8.3.9 distinct, dedupe and distinct?

8.3.10 replace

8.3.11 reverse

9 Sequential Generation

9.1 From Collections

9.1.1 seq and sequence

9.1.2 rseq

9.1.3 subseq and rsubseq

9.1.4 seque

9.2 Abstract Generators

9.2.1 repeatedly

9.2.2 iterate

9.2.3 repeat and cycle

9.3 Other Generators

9.3.1 lazy-seq

9.3.2 tree-seq

9.3.3 file-seq

9.3.4 xml-seq

9.3.5 re-seq

9.3.6 line-seq

9.3.7 resultset-seq

9.3.8 iterator-seq and enumeration-seq

9.3.9 concat and lazy-cat

9.4 Lists

9.4.1 list and list*

9.4.2 cons

10 Sequential Processing

10.1 rest, next, fnext, nnext, ffirst, nfirst and butlast

10.2 drop, drop-while, drop-last, take, take-while, take-last, nthrest, nthnext

10.3 keep and keep-indexed

10.4 mapcat

10.5 interpose and interleave

10.6 partition, partition-all and partition-by

10.7 flatten

10.8 distinct, dedupe and distinct?

10.9 take-nth

10.10 split-at and split-with

10.11 when-first

10.12 chunk-cons, chunk-first, chunk-rest, chunk-next, chunk-buffer, chunk-append and chunk

11 Maps

11.1 Creating

11.1.1 hash-map

11.1.2 array-map

11.1.3 sorted-map and sorted-map-by

11.1.4 create-struct, defstruct, struct-map, struct and accessor

11.1.5 zipmap

11.2 Accessing

11.2.1 keys and vals

11.2.2 find, key and val

11.2.3 select-keys and get-in

11.3 Processing

11.3.1 assoc, assoc-in and dissoc

11.3.2 update and update-in

11.3.3 merge and merge-with

11.3.4 reduce-kv

11.4 Map utilities

11.4.1 clojure.walk/keywordize-keys and clojure.walk/stringify-keys

11.4.2 clojure.set/rename-keys

11.4.3 clojure.set/map-invert

12 Vectors

12.1 vector

12.2 vec

12.3 peek and pop

12.4 vector-of

12.5 mapv

12.6 filterv

12.7 subvec

13 Sets

13.1 hash-set

13.2 set

13.3 sorted-set and sorted-set-by

13.4 disj

13.5 union, difference and intersection

13.6 subset? and superset?

13.7 select, index, rename, join and project

Part 4: Solving specific problems

14 Concurrency

14.1 future

14.2 promise and deliver

14.3 delay

14.4 ref

14.5 atom

14.6 agent

14.7 deref and realized?

14.8 set-validator! and get-validator

14.9 add-watch and remove-watch

14.10 locking, monitor-enter and monitor-exit

15 Types, Classes, Hierarchies and Polymorphism

15.1 symbol and keyword

15.1.1 name

15.1.2 find-keyword

15.2 type checking

15.2.1 type, instance? and class

15.3 gen-class and gen-interface

15.3.1 gen-interface

15.4 deftype and definterface

15.5 proxy

15.6 reify

15.7 defrecord

15.8 defprotocol

15.9 extend, extend-type and extend-protocol

15.10 derive and make-hierarchy

15.11 defmulti and defmethod

16 Vars and Namespaces

16.1 def, declare, intern and defonce

16.2 var, find-var and resolve

16.3 alter-var-root and with-redefs

16.4 binding

16.5 with-local-vars, var-get and var-set

16.6 ns, in-ns, create-ns and remove-ns

16.7 alias, ns-aliases and ns-unalias

16.8 ns-map and ns-unmap

16.9 ns-publics, ns-interns, ns-imports

16.10 refer, refer-clojure, require, loaded-libs, use, import

16.11 find-ns and all-ns

16.12 the-ns, ns-name and namespace

16.13 meta, with-meta, vary-meta, alter-meta! and reset-meta!

17 Evaluation

17.1 read and read-string

17.1.1 read

17.1.2 read-string

17.2 eval

17.3 test and assert

17.4 load, load-file, load-reader and load-string

17.4.1 load

17.4.2 load-file

17.4.3 load-string

17.4.4 load-reader

17.5 compile

17.6 clojure.edn/read and clojure.edn/read-string

17.7 tagged-literal and tagged-literal?

17.8 default-data-readers

17.9 reader-conditional and reader-conditional?

18 Formatting and Printing

18.1 format, printf and cl-format

18.2 pr, prn, pr-str, prn-str, print, println, print-str, println-str

18.3 pprint, pp, write and print-table

18.4 print-method, print-dup and print-ctor

18.5 slurp and spit

19 Strings and Regular Expressions

19.1 str

19.2 join

19.3 replace, replace-first, re-quote-replacement

19.4 subs, split and split-lines

19.5 trim, triml, trimr, trim-newline

19.6 escape, char-name-string, char-escape-string

19.7 lower-case, upper-case, capitalize

19.8 index-of, last-index-of

19.9 blank?, ends-with?, starts-with?, includes?

19.10 re-pattern, re-matcher, re-groups, re-seq, re-matches, re-find

20 Mutation and Side Effects

20.1 transient, persistent!, conj!, pop!, assoc!, dissoc! and disj!

20.2 doseq, dorun, run!, doall, do

20.3 volatile!, vreset!, vswap! and volatile?

20.4 set!

21 Java Interoperation

21.1 ".", ".." and doto

21.2 new

21.3 try, catch, finally and throw

21.4 ex-info and ex-data

21.5 bean

21.6 reflect and type-reflect

21.7 Java Arrays

21.7.1 make-array

21.7.2 object-array and other typed initializers

21.7.3 to-array, into-array, to-array-2d

21.7.4 aget, aset, alength and aclone

21.7.5 amap and areduce

21.7.6 set-int and other types setters

21.7.7 ints and other typed array casting

The Toolbox

22.1 clojure.xml

22.2 clojure.inspector

22.3 clojure.repl

22.3.1 doc

22.3.2 find-doc

22.3.3 apropos

22.3.4 dir

22.3.5 dir-fn

22.3.6 source

22.3.7 source-fn

22.3.8 pst

22.3.9 root-cause

22.3.10 munge, demunge and stack-element-str

22.4 clojure.main

22.4.1 load-script

22.4.2 repl

22.5 clojure.java.browse

22.6 clojure.java.shell

22.7 clojure.core.server

22.7.1 stop-server

22.8 clojure.java.io

22.8.1 Streams, Writers and Readers

22.8.2 reader

22.8.3 with-open

22.8.4 writer

22.8.5 Resources and URLs

22.8.6 resource

22.8.7 as-url

22.8.8 Dealing with Files

22.8.9 file

22.8.10 copy

22.8.11 make-parents

22.8.12 delete-file

22.8.13 as-relative-path

22.8.14 clojure.test

22.8.15 clojure.java.javadoc

What's inside

Each function or macro is presented with:

  • An introduction including areas of application and main goals
  • A more rigorous contract section, including parameters and return types
  • Real world examples of the function in action
  • Background and conceptual information necessary to better understand the function
  • Diagrams and comparison tables
  • Implementation details and performance implications

About the reader

For developers of all skill levels who need a thorough reference to Clojure standard library.

About the author

Renzo Borgatti is a software engineer with more than 15 years of experience in the field. Renzo worked with Java, Ruby, and Objective-C before discovering Clojure and functional programming a few years ago, a passion that quickly turned into professional work. He's a frequent speaker at user groups and conferences.


Manning Early Access Program (MEAP) Read chapters as they are written, get the finished eBook as soon as it’s ready, and receive the pBook long before it's in bookstores.
MEAP combo $25.00 $59.99 pBook + eBook + liveBook
MEAP eBook $47.99 pdf + ePub + kindle + liveBook
Prices displayed in rupees will be charged in USD when you check out.

placing your order...

Don't refresh or navigate away from the page.

FREE domestic shipping on three or more pBooks