Clojure was created by Rich Hickey and released in 2007 (see the overview), and its first stable version was 1.0. Releases are numbered 1.N, with fixes in 1.N.M. Code written for an older release nearly always runs on a newer one. The notes below follow changes.md of the Clojure source (kept from 1.3 to 1.12.6); the earlier releases are summarised from the reference pages and from memory, and say so.
Releases
| Version | What it added or changed |
|---|---|
| 1.0 | the first stable release: the reader, special forms, persistent collections, sequences, vars, refs, agents, atoms, multimethods, macros and Java interop. (Not in the downloaded notes.) |
| 1.1 | transients (transient, persistent!, conj! and the others for vectors, hash maps and hash sets) and function pre- and post-conditions (:pre and :post) are marked "since 1.1" in the reference. Chunked sequences, futures and promises are also from this release, from memory |
| 1.2 | protocols and datatypes (defprotocol, deftype, defrecord, reify), from memory; not in the downloaded notes |
| 1.3 | primitive support (long and double arithmetic by default, with overflow checking, and +' style operators to promote); earmuffed vars are no longer automatically dynamic (a var must be marked ^:dynamic); ISeq no longer inherits from Sequential; defrecord and deftype improvements (->Foo and map->Foo, the #my.Type[…] forms); clojure.reflect/reflect, clojure.data/diff, every-pred, some-fn, realized?, with-redefs, find-keyword, clojure.repl/pst, clojure.pprint/print-table, ^:const, a message for assert, vector-of with several arguments, binding conveyance, a documentation string for def, the contrib library split into modular libraries; replicate deprecated |
| 1.4 | reader literals (#inst and #uuid); mapv, filterv, ex-info, ex-data, reduce-kv; require takes :refer; *compiler-options*; contains? improved; the dot syntax for fields of records ((.-field r)); hash no longer relies on hashCode |
| 1.5 | reducers; the threading macros cond->, cond->>, as->, some->, some->>; clojure.edn (the edn reader) and a safer *read-eval*; send-via, set-agent-send-executor! and set-agent-send-off-executor!; column metadata captured by the reader; gen-class improvements; support for marker protocols |
| 1.6 | the minimal Java API clojure.java.api.Clojure; map destructuring with namespaced keys ({:keys [x/a]}); new hashing functions (hash-ordered-coll and hash-unordered-coll); bit operations; clojure.test changes; JDK 1.6 as the minimum |
| 1.7 | transducers; reader conditionals and the .cljc extension; update; run!; keyword and symbol construction; a warning for boxed math; faster reduce and iterator paths; printing as data |
| 1.8 | direct linking (compile with it so that calls skip the var; ^:redef and ^:dynamic are never direct-linked); the string functions index-of, last-index-of, starts-with?, ends-with? and includes? in clojure.string; the socket server and socket REPL (a JVM property clojure.server.name holding an edn map) |
| 1.9 | spec; clojure.core macros checked against specs at compile time; maps with qualified keys (#:ns{…}, #::{…}, :ns/keys); new predicates (boolean? int? pos-int? neg-int? nat-int? double? ident? simple-ident? qualified-ident? simple-symbol? qualified-symbol? simple-keyword? qualified-keyword? bytes? indexed? uuid? uri? seqable? any?); the Inst protocol with inst? and inst-ms; bounded-count, swap-vals!, reset-vals!, halt-when; symbolic values ##Inf ##-Inf ##NaN; *reader-resolver* |
| 1.10 | errors identify their phase (reading, macroexpansion, compilation, execution, printing) in the exception data with keys such as :clojure.error/phase, and clojure.main/ex-triage and ex-str report them; protocol extension via metadata (:extend-via-metadata); tap>, add-tap and remove-tap; read+string; the alpha stream REPL prepl; datafy and nav; ex-cause, ex-message, requiring-resolve, PrintWriter-on, serialized-require |
| 1.11 | a function that takes keyword arguments also accepts a trailing map; :as-alias in require; the namespace clojure.math; abs, NaN?, infinite?; parse-long, parse-double, parse-uuid, parse-boolean; random-uuid; update-keys, update-vals; iteration |
| 1.12 | interactive libraries: add-lib, add-libs, sync-deps in clojure.repl.deps and clojure.tools.deps.interop/invoke-tool; clojure.java.process (start, exec); method values and qualified methods (Class/method, Class/.method, Class/new); :param-tags metadata and the syntax ^[tag ...]; array class syntax String/2; Java functional interfaces and Supplier interop from Clojure functions and IDeref; stream-seq!, stream-reduce!, stream-transduce!, stream-into!; a spliterator for vectors; partitionv, partitionv-all, splitv-at; a stricter var interning policy |
| 1.12.1 to 1.12.6 | fixes: qualified symbols in invocation position, gen-class with array class symbols, functional-interface conversion, add-libs, compiler emission, LazySeq and Iterate serialisation, reify metadata, constantly, interface default methods in gen-class |
After 1.12.6, the web page for destructuring describes the directives :keys!, :strs!, :syms!, :select and :all, and a & list of unbound keys in :keys, as "since 1.13". That version was not in the release notes that were downloaded.
What the viewer does about versions
The viewer does not know which version a file is written for. Forms that exist only in recent versions are coloured the same way as the rest: #? (1.7) and ##Inf (1.9) are read in every file, and library names added in a version (parse-long, update-keys, partitionv) are coloured as functions whatever the version. The ClojureScript, ClojureCLR and other dialects have their own version numbers; see Dialects.
Not described
Known, not yet covered
- Reference: each version is summarised by the headings and the main items of its notes; every enhancement, bug fix and performance change of 1.3 to 1.12 (about 150 KB of notes) is not listed, and the release notes of the ClojureScript, ClojureCLR and other implementations are not covered.
- Reference: the notes of Clojure 1.0, 1.1 and 1.2 were not in the downloaded
changes.md(it begins at 1.3); the entries for them above are from the reference pages and from memory.
Unknown
- Reference: the release dates of each version are not stated here because they were not in the downloaded sources; the year 2007 for the first public release is from the existing overview of this site.
See also
- Overview – the file kinds and where each is described
- Common Lisp: history and standards and Racket: history and versions