The jank programming language
jank is a general-purpose programming language which embraces the interactive, value-oriented nature of Clojure as well as the desire for native compilation and minimal runtimes. jank is strongly compatible with Clojure and considers itself a dialect of Clojure. Please note that jank is under heavy development; assume all features are planned or incomplete.
Where jank differs from Clojure JVM is that its host is C++ on top of an LLVM-based JIT. This allows jank to offer the same benefits of REPL-based development while being able to seamlessly reach into the native world and compete seriously with JVM's performance.
Still, jank is a Clojure dialect and thus includes its code-as-data philosophy and powerful macro system. jank remains a functional-first language which builds upon Clojure's rich set of persistent, immutable data structures. When mutability is needed, jank offers a software transaction memory and reactive agent system to ensure clean and correct multi-threaded designs.
01
Iterate like you would with Clojure
Iterate in the REPL and build your program from the ground up without leaving your editor.
02
Reach into the native world
Seamlessly switch to inline C++ within your Clojure source, while still having access to your Clojure code using interpolation.
03
Compile to machine code
jank is built on an LLVM-based JIT. With AOT enabled, both statically and dynamically linked executables can be generated. The jank compiler itself has very speedy start times and low memory usage.
04
World-class errors
jank stands in its own category among lisps for its error reporting quality. No bloated JVM stack traces, opaque errors, or lack of context.

Strongly compatible with Clojure
If it works with Clojure JVM and it works with ClojureScript, it should work with jank. There's a :jank reader conditional for when you need it.
Use your favorite nREPL editor plugin. jank uses an LLVM-based JIT to compile machine code on the fly.
Reach into native libraries or interact directly with your native code base. Seamlessly write both C++ and Clojure in the same file.
Leiningen, LSP, nREPL planned from the start. jank's compiler is also written with tooling in mind, so it can be used for lexing, parsing, and analysis.
Generate a movie index
jank has very powerful capabilities for representing and transforming arbitrary data. Here, idiomatic usages of reduce, zipmap, repeat, and merge-with help create an index from genre to movie id with ease. No lenses are required for working with nested data.
Convert bytes to human readable format
Beyond the traditional map, filter, and reduce, jank provides a powerful loop macro for more imperative-style loops while still being purely functional. Each loop has one or more corresponding recur usages which must be in tail position.
Truncate a string to a max length
jank's strings, as well as most of its other data structures, are immutable. However, jank provides such powerful tools for working with data that mutability is very rarely a concern.
Redefine any var
Every def or defn exists within a var, which is a stable, namespace-level container for values. Vars can be redefined to contain different values. with-redefs redefines a var within its body's scope, which is very useful for removing side effects from test cases or forcing functions to return specific values.
.png)


