Skip to content
DEPRECATED SEE BELOW Gradual typing for Clojure
Find file
New pull request
Latest commit e66e9b4 @frenchy64 core.typed move notice.

This repository has moved: core.typed

Leiningen dependency (Clojars):

[typed "0.1.6"]

Typed Clojure

Gradual typing in Clojure, as a library.

[Talk] Clojure Conj 2012



See wiki.


Typed Clojure is released under the same license as Clojure: Eclipse Public License v 1.0.




  • Ensure Result is not introduced when performing type inference on drest fn apps
  • tc-ignore is more do-like.

    Workaround for a quirk in the Clojure compiler where protocols only get generated in a top-level do.

  (identity (do (def-protocol foo (bar [this]))
              bar)) ;; <-- bar cannot be resolved
  (do (def-protocol foo (bar [this]))
    bar)  ;; <-- bar is resolvable

(patch by Stephen Compall, issue #3)

  • Fix typo in into-array logic (patch by Stephen Compall, issue #4)
  • into-array> generalises Java types, does not need redundant type annotations. See User Documentation in wiki.
  • Improve type of clojure.core/class. (class ) is always a Class (class nil) is always a nil
  • Move documentation to wiki.


  • Better errors for Java methods and polymorphic function applications, borrow error messages from Typed Racket
  • Change ann-datatype, ann-protocol, ann-pprotocol syntax to be flatter (ann-protocol pname method-name method-type ...) (ann-dataype dname [field-name :- field-type ...])
  • Add defprotocol>


  • Support Clojure 1.4.0+
  • Better errors, print macro-expanded form from AST


  • Refactor typed.core into individual files
  • Add method-type
    • (method-type ' prints the current Typed Clojure type for the getName method of File
  • Add types for some clojure.core coersion functions
  • Preliminary support for ClojureScript


  • Fix objects and filters being lost during polymorphic and dotted function applications
    • Add tests for (if (seq a) (first a) 0) filter example.
  • Can annotate datatypes outside current namespace
  • Improve type of seq, next, conj
  • tc-pr-env -> print-env
  • tc-pr-filters -> print-filterset
  • Alter APersistentMap
  • Check that local binding occurrences match with expected types
  • Heterogeneous maps are APersistentMap's instead of IPersistentMap's
  • Heterogeneous vectors are APersistentVector's instead of IPersistentVector's


  • Ensure ann-form finally checks its expression is of the expected type
  • Improve simplifying of intersections involving Java classes


(typed.core/ann v t) gives var v the static type t.

(typed.core/ann-form f t) ensures form f is of the static type t.

(typed.core/check-ns) type checks the current namespace.

(typed.core/cf t) type checks the form t.


(These don't completely type check yet)

Future work

  • Equality filters for occurrence typing
  • Type check multimethods
  • Rest type checking in fn definition
  • Type check defprotocol definitions
  • Unify AST with ClojureScript
  • Namespace dependency management


Stephen Compall (S11001001)

Something went wrong with that request. Please try again.