Clojure-Resources
This is a compilation of links and resources for learning about Clojure, ClojureScript, Om and more broadly, LISP. It is still in very early stages. Please feel free to add resources by issuing a pull request (preferred) or by getting in touch. Please also don't hesitate to suggest a better sort order.
Clojure
- Clojure Homepage
- Clojure Google Group
- Clojure Cheat Sheet
- Inspecting the content of channels in core.async
- Clojure Copter - Control for the AR Parrot Drone
- Clojure Users - Linkedin Group
- Clojure compilation: helped me learn more about ahead-of-time compilation (AOT).
- xsc/pandect on GitHub: Fast and easy-to-use Message Digest, Checksum and HMAC library. I use it in the Clojure version of my BirdWatch project & it works like a charm.
- Clojure Documentation: community-driven documentation project
- Clojure for the Brave and True - Writing Macros: before this article, I did not know that there was a connection between hair growth potion and macros. Well, I still don't know that. But entertaining nonetheless. And I now understand macros.
- Clojure Distilled: an introduction to core Clojure concepts
- Clojure Gazette: Weekly Newsletter to inspire Clojure programmers.
- SICP distilled: Kickstarter project aimed at translating SICP (see in the last section) into Clojure. This looks really cool, you should go fund it while you still can. I have done the same.
- Clojurecademy: Learning Clojure Interactively(Hands-On).
Clojure libraries
- clj-time/clj-time on GitHub: wrapper for Joda Time
- clojure/data.priority-map on GitHub: implementation of a priority map in Clojure. Useful when you want a sorted map that is sorted based on the values, not the keys.
- damballa/parkour on GitHub: Hadoop MapReduce in idiomatic Clojure.
- Monger, a Clojure client for MongoDB
- Overtone: make music from your REPL
- Live Coding. Live Synths. Live Music.: music made with Clojure and Overtone
- The Clojure Toolbox: a categorised directory of libraries and tools for Clojure
- aengelberg/loco on GitHub: A Constraint Programming library for Clojure. I can see how this can be useful in an application.
- clojure/core.typed: An optional type system for Clojure
- ckirkendall/fresnel: A library for composing lenses and working with complex state objects
- MichaelDrogalis/dire on GitHub: Erlang-style supervisor error handling for Clojure. I have not tried it yet, but it does look like an interesting concept, particularly after having worked with supervisors within the actor model for a while. Has anyone used this in a real application?
- prismatic/schema on GitHub: Clojure(Script) library for declarative data description and validation
- 22rbrush/clara-rules on GitHub: Forward-chaining rules in Clojure
- ptaoussanis/carmine on GitHub: Clojure Redis client & message queue
- killme2008/defun on GitHub: A macro to define clojure functions with parameter pattern matching just like erlang or elixir. Looks useful.
- AvisoNovate/rook on GitHub: Sane, smart, fast, Clojure web services
- sjl/metrics-clojure on GitHub: A thin façade around Coda Hale's metrics library.
- dakrone/clj-http on GitHub: An idiomatic clojure http client wrapping the apache client.
- http-kit/http-kit on GitHub: http-kit is a minimalist, event-driven, high-performance Clojure HTTP server/client library with WebSocket and asynchronous support
- greglook/puget on GitHub: Canonical Colorizing Clojure Printer
- funcool/buddy on GitHub: Security library for Clojure
- mpenet/jet on GitHub: Jetty9 ring server adapter with WebSocket support via core.async and Jetty9 based HTTP & WebSocket clients (jvm based, no cljs)
- raines/fs on GitHub: useful library for manipulating files and working with the filesystem
- clj.qrgen on GitHub: generate QR code, for example for serving code as PNG file in ring handler
Learn the language
- Clojure from the ground up: very encouraging series of articles for beginners. I also really appreciate the introduction.
- Clojure for the Brave and True (a Book for Beginners): great intro, I particularly enjoyed the introduction to Emacs in conjunction with Clojure
- Introduction to Clojure: short introduction to the Clojure basics. With this, it should be possible to learn the language itself on a rainy afternoon.
- Clojure.core: Batteries (almost) included - Adam Bard (06/2013): a guided tour through some of the many libraries available from the Clojure team that don't come distributed with Clojure.
- bbatsov/clojure-style-guide on GitHub: A community coding style guide for the Clojure programming language
- Library Coding Standards (last edit 04/2014): coding standards on http://dev.clojure.org
- clojure-cookbook/clojure-cookbook on GitHub: This is the home of O'Reilly's Clojure Cookbook
ClojureScript
- clojure/clojurescript - GitHub
- shadow-cljs: the only sane way to build ClojureScript
- ClojureScript Google Group
- ClojureScript-in-ClojureScript REPL
- ClojureScript One
- Translations from JavaScript: plenty of JavaScript code snippets and their translation to ClojureScript
- Calling javascript functions from clojurescript
- Specljs and ClojureScript
- tailrecursion/cljs-priority-map on GitHub: ClojureScript port of clojure/data.priority-map
- mfikes/goby - GitHub: Develop iOS apps with ClojureScript
- swannodette/mies - GitHub: Minimal ClojureScript project template
- ClojureScript: JavaScript Interop - 09/2014: Blog post about interacting with JavaScript
- andrewmcveigh/cljs-time - GitHub: A clj-time inspired date library for clojurescript
- shaunlebron/ClojureScript-Syntax-in-15-minutes on GitHub: cljs syntax is simple
- bensu/doo on GitHub: finally a pleasant experience for running tests on the JavaScript side
ClojureScript libraries
- lbradstreet/cljs-uuid-utils - GitHub: Micro lib with ClojureScript implementation of a random, type 4 UUID generator compatible with cljs.core/UUID
- yogthos/markdown-clj on GitHub: library for rendering markdown into HTML
Structuring an application
- Organizing Your Project: a Librarian's Tale: useful chapter from the Clojure for the Brave and True book about code organization and namespaces. It's a little long but it still covers the topic well enough.
- stuartsierra/component on GitHub: okay, so this one had been on my list for a while. Started watching Stuart's video a few times. Now I finally got around to using it. And all I can say is you really have to take a closer look at this. It makes structuring a larger application so much more straightforward. And the earlier you do, the more pain you save later. Rewriting an existing application is doable, but somewhat painful.
- danielsz/system on GitHub: set of readymade components on top of the component library above.
- palletops/leaven on GitHub: lightweight component model for both Clojure and ClojureScript.
- palletops/bakery on GitHub: A library of components for leaven, the component library above.
- MichaelDrogalis/onyx on GitHub: Distributed, fault tolerant data processing for Clojure. It does sound like an interesting and very ambitious concept for building distributed applications. On my list of things to maybe try at some point.
- Building a System in Clojure: book by the maintainer of this repository about structuring complex applications.
Web development / Om
- Keechma: a pluggable micro framework for Reagent
- weavejester/compojure on GitHub: a truly concise routing library for Clojure web applications.
- Luminus: a Clojure micro-framework in style of Flask/Sinatra
- swannodette/om - GitHub: a ClojureScript library on top of Facebook's React library. React and ClojureScript are a great match as React is particularly well suited for rendering immutable data structures.
- A slice of React, Clojurescript and Om: article rewriting some React samples using Om
- Om: Enhancing Facebook's React with Immutability
- Reagent: alternative ClojureSCript React wrapper
- ptaoussanis/sente on GitHub: powerful library for connecting a Clojure server application and a ClojureScript client side application via the WebSockets protocol. I'm using this successfully in my BirdWatch project.
- Compojure apps, in the style of Sinatra - Adam Bard, 09/2014: excellent introduction to Compojure, inspired by Sinatra's getting started guide.
- noprompt/garden on GitHub: Generate CSS with Clojure
core.async
- clojure/core.async on GitHub
- Implementation details of core.async Channels - Rich Hickey (07/2014)
- Slides for the talk above
- Clojure core.async API Reference: descriptions oftentimes too short to fully understand how to use the constructs in my opinion, but at least a starting point
- Combining & Controlling Channels with core.async's merge and mix
- Mastering Time with Clojure core.async
- core.async and Blocking IO: article discussing blocking IO and how to deal with it and why non-blocking is preferable. Great, concise read.
- Code Read of core.async Timeouts
- Publish and Subscribe with core.async's pub and sub: useful and well-written introduction to the topic of Publish-Subscribe. I like the idea of a channel-driven Rube Goldberg machine. Can we have crazy animations with that as well?
Transducers
- Inside Transducers - Rich Hickey (11/2014): A talk about transducers and core.async.
- Transducers - Rich Hickey (09/2014): Rich Hickey talks about Transducers. Excellent talk as usual, must see.
- TRANSDUCERS ARE COMING - Rich Hickey (08/2014): Introduction of the concept by Rich Hickey himself
- Green Eggs and Transducers - Carin Meier (09/2014): A quick tour of Clojure Transducers with core.async with Dr. Seuss as a guide.
- Understanding Transducers - Elben Shira (09/2014): "This article explores transducers by ignoring transducers. Instead we will examine two ordinary functions, map and filter. We'll play with them and scrutinize them."
- richhickey/transducerfun.clj on GitHub: Gist with some code
- ptaoussanis / transducers.clj - GitHub Gist: well-documented code snippet
Tools
- Leiningen: for automating Clojure projects without setting your hair on fire (from the project website). Hard to imagine using Clojure without it.
- Signing and Promoting your Clojure libraries on Clojars (03/2013): helpful guide for signing Clojars artifacts
- How Clojure Babies are Made: What Leiningen Is: fun read, helps understand what Leiningen really is
- How Clojure Babies Are Made: Understanding lein run: this article helps you understand how gruesome a place the world would be without Leiningen
- overtone/emacs-live - GitHub
- clojure-emacs/cider - GitHub
- Clojure with Emacs
- LightTable: IDE for Clojure and ClojureScript. Great for people who (still) struggle with Emacs.
- Riemann: Riemann monitors distributed systems. Looks really useful for understanding systems under load.
- lein-difftest on GitHub: plugin for pretty test output (like green for success). Hasn't been worked on since 2012, but still working.
- lein-quickie on GitHub: plugin for leiningen that automatically re-runs your tests when it detects file system changes. Works as expected.
- dsabanin/clj-pid on GitHub: Tiny Clojure library to get current process ID and save/read PID files. Useful when deploying an uberjar.
- A Pretty Printer for Clojure: always useful when trying to read Clojure's datastructures as a human being.
- Dockerizing a Clojure Application - Ryan Neufeld (09/2014): something I've been wanting to do for a while.
- jonase/kibit on GitHub: There's a function for that! Static code analyzer for Clojure.
- kovasb/session on GitHub: clojure-based live-coding environment
- jonase/eastwood on GitHub: a Clojure lint tool
- AvisoNovate/pretty on GitHub: Library for helping print things prettily, in Clojure - ANSI fonts, formatted exceptions
- JonyEpsilon/gorilla-repl on GitHub: A rich REPL for Clojure in the notebook style. http://gorilla-repl.org
- **dakrone/lein-bikeshed on GitHub: A Leiningen plugin designed to tell you your code is bad, and that you should feel bad
- **borkdude/clj-kondo: A linter for Clojure code that sparks joy.
Distributed computing
- Avout: Distributed State in Clojure, provides a distributed implementation of Clojure's Software Transactional Memory (STM)
- eggsyntax/datawalk on GitHub: Interactively explore complex data structures at the REPL with minimum keystrokes
Data analysis
- Incanter: Clojure-based, R-like statistical computing and graphics environment for the JVM
Blog posts
- Planet Clojure: Planet Clojure is a meta blog that collects posts from the blogs of various Clojure hackers and contributors.
- Do Things: a Clojure Language Crash Course
- Relevance Blog
- My Clojure Workflow, Reloaded - Stuart Sierra
- A Closer Look at Transit
- WHY I'M PRODUCTIVE IN CLOJURE
- Ten reasons to use Clojure/ClojureScript on your next web dev project - Adam Bard
- Learn X in Y minutes Where X=clojure
- A simple Clojurescript app - Adam Bard
- Distributed Communicating Sequential Processes (CSP) - David Pollak
- Inspecting the content of channels in core.async
- Why Clojure will win
- Building Clojure Services at Scale
- Appointment scheduling in Clojure with Loco: introduction to contraints programming with Loco (above in the libraries section) using scheduling as an example.
- My Top Clojure Articles - Adam Bard (07/2014): haven't read them yet, but I like his other articles, so these are on my reading list. Looks like interesting stuff.
- Building a System in Clojure - Part 1 (09/2014): first of my series of articles about building a system in Clojure.
- "Good Enough" error handling in Clojure - Adam Bard (05/2013): I enjoyed this article about error handling.
- Clojure Tutorials on Semaphore Community - a collection of Clojure related tutorials covering testing, deployment, continuous integration and other topics.
- API Authentication with Liberator and Friend: useful blog post when you have API authentication needs
Videos
- Talk Transcripts: transcripts of interesting talks
- The Functional Final Frontier - David Nolen (10/2014): David Nolen talks about Om and functional UI programming transcript
- Transducers - Rich Hickey (09/2014): Rich Hickey talks about Transducers. Excellent talk as usual, must see. transcript
- Simple Made Easy - Rich Hickey: one of my favorite presentations. Like overall. Highly recommended. transcript
- Hammock Driven Development - Rich Hickey transcript
- Clojure - Rich Hickey
- Are we there yet? - Rich Hickey
- Reducers - A Library and Model for Collection Processing - Rich Hickey transcript
- The Language of the System - Rich Hickey, Conj 2012: less about Clojure and more about the design of systems in general. Well worth watching (like all of Rich Hickey's talks, really). transcript
- Design, Composition and Performance - Rich Hickey
- Clojure core.async - Rich Hickey transcript
- ClojureScript: Lisp's Revenge - David Nolen
- Activity Stream Processing in Clojure - Travis Vachon
- Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure
- ClojureScript - Better Semantics at Low Low Prices! - David Nolen
- Pete Hunt - The Secrets of React's Virtual DOM (FutureJS 2014)
- Clojure in the Large - Stuart Sierra
- Quick Intro to Live Programming with Overtone
- EuroClojure 2014 videos: 18 recorded presentations, plenty of interesting stuff
- Mobile App Development with ClojureScript and Cordova: talk given at the NYC Clojure Users Group in July 2014 about building a hybrid app with Apache Cordova, ClojureScript, cor.async and Om. Looks promising.
- Components Just Enough Structure - Stuart Sierra, Clojure/West 2014: presentation on the Components library.
- LispCast Videos: For-pay video courses teaching Clojure.
Slides
Podcasts
- The Cognicast: podcast by Cognitect, the guys behind Clojure.
- defn: the number one vegetarian Clojure podcast by Vijay Kiran and Ray McDermott. Casual, fun and NSFW interviews with Clojure luminaries.
- Functional Geekery: podcast on all things functional programming, sometimes featuring Clojure as well.
Comparisons with other languages
- Clojure vs Scala (12/2013): comparing Clojure and Scala. I agree that Clojure guides you towards simpler solutions.
- Clojure's core.typed vs Haskell - A Project Euler showdown (09/2013): comparing the approaches to two mathematical problems in Haskell and Clojure / core.typed.
- MODERN CONCURRENCY: ERLANG, SCALA, GO, CLOJURE (2013): slideshow comparing approaches to concurrency in different languages. NOTE: this appears to predate core.async. But CSP-style channels are mentioned for golang, so the same applies to Clojure with core.async in addition to STM and agents.
LISP
- Structure and Interpretation of Computer Programs
- The Nature of Lisp
- Structure and Interpretation of Computer Programs - Lecture Videos: recorded in 1986
- Lispcast.com: Eric Normand's blog