Programming Clojure, Fourth Edition (Pragmatic Bookshelf)

PragmaticBookshelf

PragmaticBookshelf

Devtalk Sponsor

Quickly turn complex problems into simple, working solutions using functional programming, safe concurrency, and the expressive tools of Clojure.

Alex Miller @alexmiller with Stuart Halloway and Aaron Bedra

Edited by Jacquelyn Carter @jkcarter

Struggling with unnecessary complexity, unmanaged state, and brittle data that’s hard to change? Clojure combines the expressiveness of Lisp with the stability and performance of Java into a practical toolkit for creating simple, extensible applications. With immutable data structures, functional programming, and safe concurrency, Clojure makes it easier to write robust, reusable code. This definitive guide, written by members of the Clojure core team, introduces the language’s essentials and then shows how to put everything together in real applications. This edition adds practical coverage of project tooling and interactive development and fresh examples of the latest Clojure features.

Build cleaner, more reliable software that can respond to changing requirements over time. Combine Clojure’s tools for maximum effectiveness as you work with immutable data, functional programming, and safe concurrency to write programs that solve real-world problems.

Start by getting comfortable with Clojure’s concise syntax and its interactive REPL, then quickly move into building with immutable collections and the powerful sequence abstraction. Gain practical fluency with functional techniques such as higher-order functions, recursion, partial application, and memoization. Beyond the basics, learn to manage state with Clojure’s reference types, build open and extensible systems using protocols and multimethods, and unlock the power of macros for creating your own language features. Seamless Java interop lets you tap into the vast Java ecosystem without sacrificing clarity or safety.

This edition adds two new chapters on project tooling and interactive development, guiding you through modern workflows with tests, builds, editors, and the REPL at the center of your process. Learn how to set up projects, manage dependencies, and work productively in Clojure’s unique interactive style. When you’re finished, you’ll be able to think in Clojure: express solutions with clarity, leverage concurrency safely, and build real-world applications that are simpler and more maintainable than you thought possible.


Alex Miller has been a member of the Clojure core team since 2013 and is the coauthor of Clojure Brain Teasers and Clojure Applied. Alex is the creator or organizer of the Strange Loop, Lambda Jam, Clojure/west, and Clojure/conj conferences. In his free time he dabbles in music production, astronomy, and beekeeping.


Don’t forget you can get 35% off with your Devtalk discount! Just use the coupon code “devtalk.com" at checkout :+1:

Latest Threads About This Book Top

grylix
On page 42 you write recur binds new values for loop’s bindings and returns control to the top of the loop. I recommend to add, that...
New
grylix
On page 41 you write cond has no default fallthrough expression, I first thought, that the conditions must be exhaustive (as e.g. in ...
New
grylix
You could on page 38 mention, that the qualified name of a static method can be used as a function to be used later. Example: user=&gt...
New
grylix
(.x p) ;; or (.-x p) for disambiguation with 0-arity methods I was thinking some time over this comment and did not understand it; in p...
New
grylix
There is an empty box at the beginning of page 24, I assume that it is the (empty) rest of the box which is shown on page 23.
New
grylix
On page 26 you explain the use of anonymous functions with the example (require '[clojure.string :as str]) (filter indexable-word? (str/...
New
New
froucoux
book-programming-clojure-fourth-edition: bad parameter name (page 69) (range start) shall be (range end). Merry Christmas :slight_smile...
New
froucoux
Programming Clojure, Fourth Edition: error in the example of read-string use (page 48) ;; Does not evaluate, just returns as data(read-...
New
jakobsen
The code listing (defn file-names [files] (map File/.getName files)) -> #'user/file-names (file-name (.listFiles (File. "."))) -&g...
New
primer
“Follow the instructions in the README file at the root of the sample code for the book to start a REPL, then enter the following…” Curr...
New
lkuty
Code: (range start) (range start end) (range start end step) Should be: (range end) (range start end) (range start end step) Note the...
New
lkuty
In the foolowing paragraph, it could be interesting to write what the EDN acronym means. Additionally, there are variants in clojure.ed...
New
lkuty
On page 13, how to make (require 'examples.introduction) work ? How to augment the CLASSPATH such that clj is able to find examples/intro...
New
PragmaticBookshelf
Quickly turn complex problems into simple, working solutions using functional programming, safe concurrency, and the expressive tools of ...
New

Most Active This Week Top

grylix
On page 41 you write cond has no default fallthrough expression, I first thought, that the conditions must be exhaustive (as e.g. in ...
New
grylix
(.x p) ;; or (.-x p) for disambiguation with 0-arity methods I was thinking some time over this comment and did not understand it; in p...
New
grylix
On page 42 you write recur binds new values for loop’s bindings and returns control to the top of the loop. I recommend to add, that...
New
grylix
You could on page 38 mention, that the qualified name of a static method can be used as a function to be used later. Example: user=&gt...
New

Most Active This Month Top

New
lkuty
On page 13, how to make (require 'examples.introduction) work ? How to augment the CLASSPATH such that clj is able to find examples/intro...
New
grylix
There is an empty box at the beginning of page 24, I assume that it is the (empty) rest of the box which is shown on page 23.
New

Most Active This Year Top

PragmaticBookshelf
Quickly turn complex problems into simple, working solutions using functional programming, safe concurrency, and the expressive tools of ...
New
lkuty
In the foolowing paragraph, it could be interesting to write what the EDN acronym means. Additionally, there are variants in clojure.ed...
New
lkuty
Code: (range start) (range start end) (range start end step) Should be: (range end) (range start end) (range start end step) Note the...
New
froucoux
Programming Clojure, Fourth Edition: error in the example of read-string use (page 48) ;; Does not evaluate, just returns as data(read-...
New
primer
“Follow the instructions in the README file at the root of the sample code for the book to start a REPL, then enter the following…” Curr...
New
jakobsen
The code listing (defn file-names [files] (map File/.getName files)) -> #'user/file-names (file-name (.listFiles (File. "."))) -&g...
New
froucoux
book-programming-clojure-fourth-edition: bad parameter name (page 69) (range start) shall be (range end). Merry Christmas :slight_smile...
New

Most Active Last Three Years Top

Most Active Over Three Years Top

Get money off!

The Pragmatic Bookshelf

35% off any eBook

Use the coupon code "devtalk.com" to get 35% off any eBook published by PragProg!

Related Portals