Problem

Clojure today exists at a balance point between performance and dynamic flexibility. Some users would be willing to sacrifice dynamic features to gain more performance. Other users would be willing to sacrifice performance to gain better development error messages or debugging. The problem we aim to solve is to alter the Clojure build such that we can produce alternate versions of Clojure that are useful to smaller audiences while retaining Clojure as it is today.

Example builds we may want to produce (examples, not finalized):

Constraints 

Clojure users:

Build:

Integration / release infrastructure:

Compiler:

Linking Choices

When a ns is compiled, for every call it can make a different linking decision:

 

Usage Scenarios

Clojure dyn (AOT)

Clojure prod (AOT)

Application dyn
Application prod (source) 
Application prod (AOT)

 

Research

Maven coordinate options

Maven custom assembly

Custom script (ant, make, etc)