Optional typing in Clojure, as a library.
tldr; see the minimal example project for Typed Clojure[Script] setup.
Typed Clojure is separated into modules. You'll want the full type checker at development time, and the runtime dependencies in production.
In Clojure CLI's deps.edn
, this will look something like this:
{:deps {org.typedclojure/typed.clj.runtime {:mvn/version "1.2.1"}}
:aliases {:dev {:extra-deps {org.typedclojure/typed.clj.checker {:mvn/version "1.2.1"}}}}}
You can then start a dev repl with clj -A:dev
.
In Leiningen's project.clj
, it will look something like this:
(defproject com.my-domain/a-project "1.0.0-SNAPSHOT"
:dependencies [[org.typedclojure/typed.clj.runtime "1.2.1"]]
:profiles {:dev {:dependencies [[org.typedclojure/typed.clj.checker "1.2.1"]]}})
Then, lein repl
will automatically activate the :dev
profile. Verify the type
checker is not included in uberjars with lein with-profile uberjar deps :tree
.
For ClojureScript support, use org.typedclojure/typed.cljs.runtime
and org.typedclojure/typed.cljs.checker
.
- minimal demonstrates how to statically type check Clojure[Script] namespaces
- minimal-clj demonstrates how to statically type check (just) Clojure namespaces
- malli-type-providers demonstrates how to statically type check using malli schemas
- spec1-type-providers demonstrates how to statically type check using spec1 specs
- zero-deps demonstrates how to type check a library without introducing any runtime dependency on Typed Clojure (only dev-time).
- symbolic-guide shows how to reason about symbolic execution in Typed Clojure.
Latest stable release is 1.2.1.
See modules for specific version coordinates:
- typed.clj.checker: The JVM type checker
- typed.clj.runtime: JVM Runtime dependencies
- typed.clj.analyzer: Analyzer for JVM Clojure
- typed.clj.annotator: Automatic annotator
- typed.clj.refactor: Refactoring for JVM Clojure (unreleased)
- typed.clj.reader: Reader for JVM Clojure (unreleased)
- typed.clj.lang: Extensible languages
- typed.clj.spec: Type-like specs.
- typed.malli: Malli integration.
- typed.cljs.analyzer: Analyzer for JS Clojure
- typed.cljs.checker: The JS type checker
- typed.cljs.runtime: Runtime dependencies
- typed.cljc.analyzer: Implementation-agnostic base for Clojure analyzers
- typed.lib.clojure: Base type annotations
- typed.lib.core.async: Annotations for core.async
- typed.lib.spec.alpha: Annotations for spec.alpha
Typed Clojure supports Clojure 1.12.0-alpha9 and JDK 1.8+.
Use the core.typed mailing list for Typed Clojure discussion.
#core-typed on Clojurians Slack
See wiki.
core.async Rock-paper-scissors
Thanks to the following people for contributing to core.typed:
- Stephen Compall (S11001001)
- Andrew Brehaut (brehaut)
- Christopher Spencer (cspencer)
- Reid McKenzie (arrdem)
- Di Xu (xudifsd)
- Nicola Mometto (Bronsa)
- Chas Emerick (cemerick)
- Jake Goulding (shepmaster)
- Andy Fingerhut
- Aravind K N (arav93)
- Allen Rohner (arohner)
- Minori Yamashita (ympbyc)
- Kyle Kingsbury (aphyr)
- Nathan Sorenson
- Tobias Kortkamp (t6)
- Alejandro Gomez (dialelo)
- Piotr Jarzemski (kazuhiro)
YourKit is kindly supporting core.typed and other open source projects with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling Java and .NET applications. Take a look at YourKit's leading software products:
Copyright © Ambrose Bonnaire-Sergeant, Rich Hickey & contributors.
Licensed under the EPL (see the file epl-v10.html).
Copyright © Nicola Mometto, Rich Hickey & contributors.
Licensed under the EPL (see the file epl-v10.html).
Copyright © Nicola Mometto, Rich Hickey & contributors.
Licensed under the EPL (see the file epl-v10.html).
Copyright © Nicola Mometto, Rich Hickey & contributors.
Licensed under the EPL (see the file epl-v10.html).