  Typed Clojure is an optional type system for Clojure, a dynamic language in
the Lisp family that targets the JVM. Typed Clojure enables Clojure programmers
to gain greater confidence in the correctness of their code via static type
checking while remaining in the Clojure world, and has acquired significant
adoption in the Clojure community. Typed Clojure repurposes Typed Racket's
occurrence typing, an approach to statically reasoning about predicate tests,
and also includes several new type system features to handle existing Clojure
idioms. In this paper, we describe Typed Clojure and present these type system
extensions, focusing on three features widely used in Clojure. First,
multimethods provide extensible operations, and their Clojure semantics turns
out to have a surprising synergy with the underlying occurrence typing
framework. Second, Java interoperability is central to Clojure's mission but
introduces challenges such as ubiquitous null; Typed Clojure handles Java
interoperability while ensuring the absence of null-pointer exceptions in typed
programs. Third, Clojure programmers idiomatically use immutable dictionaries
for data structures; Typed Clojure handles this with multiple forms of
heterogeneous dictionary types. We provide a formal model of the Typed Clojure
type system incorporating these and other features, with a proof of soundness.
Additionally, Typed Clojure is now in use by numerous corporations and
developers working with Clojure, and we present a quantitative analysis on the
use of type system features in two substantial code bases.
