= Clojure 1.11.0 release
Alex Miller
2022-03-22
:jbake-type: post

ifdef::env-github,env-browser[:outfilesuffix: .adoc]

Clojure 1.11 provides new syntax for keyword argument invocation, namespace aliasing without loading, a new clojure.math namespace, and many additional bug fixes and enhancements.

Keyword arguments are optional trailing variadic arguments of the form _(f akey aval bkey bval ...)_. Invoking functions with keyword arguments is convenient for people to write, but keyword args are not collections so they are hard to flow between functions. In Clojure 1.11, functions taking keyword arguments can now be passed a trailing map instead of or in addition to and following the key/value pairs. When a lone map is passed, it is used for destructuring, else the trailing map is added to the key/value pair map by conj. This change makes keyword arg functions more convenient for programmatic use.

Spec (and other libs) rely on qualified keywords as spec names. Namespace aliasing in `ns` makes long names shorter but required namespaces to exist and be loaded. In Clojure 1.11, `require` adds a new option `:as-alias`, which is like `:as` but does not require the namespace to exist or load.

The JDK package java.lang.Math provides access to many useful math functions. Clojure previously relied on using these via interop, but this had issues with discoverability, primitive performance, higher order application, and portability. The new https://clojure.github.io/clojure/#clojure.math[clojure.math] namespace provides wrapper functions for the methods available in java.lang.Math for `long` and `double` overloads with fast primitive invocation.

Additionally, a number of functions have been added to clojure.core: https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/abs[`abs`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/NaN?[`NaN?`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/infinite?[`infinite?`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-double[`parse-double`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-long[`parse-long`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-boolean[`parse-boolean`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/parse-uuid[`parse-uuid`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/random-uuid[`random-uuid`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/update-keys[`update-keys`] https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/update-vals[`update-vals`] and https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/iteration[`iteration`].

## Detailed changelog

See the https://github.com/clojure/clojure/blob/master/changes.md#changes-to-clojure-in-version-1110[change log] for a complete list of all changes in Clojure 1.11.0.

## Contributors

Thanks to all the community members who contributed patches to Clojure 1.11:

* Alexander Yakushev
* Ambrose Bonnaire-Sergeant
* Arne Brasseur
* Ghadi Shayban
* Howard Lewis Ship
* Hugo Duncan
* Jonathan Johnston
* Keyhan Vakil
* Marc O'Morain
* Michiel Borkent
* Nikita Prokopov
* Paula Gearon
* Steve Miner
