Project Ideas

Core Clojure

Lean JVM Runtime

Brief explanation: The current Clojure/JVM runtime is fully-featured, and can become even more fully-featured with projects like core.typed. However, sometimes it is important to have a leaner runtime that is less resource-intensive. This is ideal for instances where Clojure serves primarily as a library or in lean runtime environments like Google App Engine or Android where a quick startup is desirable. The goal of this project would be to create an alternative lean Clojure runtime and associated compiler. The compiler may be based either of the standard compiler or the ClojureScript compiler. Clojure vars would compile to static fields or methods. It will be necessary to find out which subset of the language makes sense (for example, vars would probably not really exist anymore).

Expected results: A lean Clojure runtime and compiler (well, some good progress to this end)

Knowledge prerequisites: A thorough understanding of Clojure and some familiarity with byte code generation for the JVM.

Difficulty: Hard

Mentor: Daniel Solano Gómez

Numerical Clojure

Many of us are working to make Clojure into a great platform for Data Science, Big Data and numerical computing. See the Numerical Clojure Group for ideas and discussions. There are many opportunities to take on exciting projects in this space - a few ideas are listed below:

Linear Algebra for Clojure

Brief explanation: core.matrix provides a powerful and flexible API for array programming and numerical computing in Clojure. To take this to the next level, it is important to implement a suite of linear algebra algorithms - including various matrix decompositions (SVD, QR, Cholesky etc.....), linear system solvers etc. These need to be added both to the core.matrix API, and to one or more core.matrix implementations. A good option would be to add these algorithms to vectorz-clj, which is a well-maintained core.matrix implementation that runs 100% on the JVM. It would be possible to port or adapt existing Java algorithms (e.g. from EJML). Our goal would be to match / exceed the performance of other Java-based libraries - see the Java Matrix Benchmark

Expected results: A clean, well-defined API for linear algebra in core.matrix. Fast working implementations of the API added to vectorz-clj, with performance comparable to the best libraries in the Java Matrix Benchmark

Knowledge prerequisites: Mathematics / linear algebra, Java, Clojure

Skill Level: Hard

Mentor: Mike Anderson

GPU.matrix

Brief explanation: core.matrix provides a powerful and flexible API for array programming and numerical computing in Clojure. It should be possible to create an implementation for core.matrix that performs computations on the GPU. Ideally, matrices would be retained in GPU memory as much as possible, to avoid unnecessary copying to/from main memory.

Incanter + core.matrix integration

Brief explanation: core.matrix provides a powerful and flexible API for array programming and numerical computing in Clojure. Incanter is a platform for statistical computing and graphics. Bringing the two together would create a powerful combination.

Expected results: Incanter modified to take full advantage of core.matrix.

Knowledge prerequisites: Statistics, Mathematics, Clojure

Skill Level: Hard

Mentor: TBC

ClojureScript

Quil on ClojureScript

Brief explanation:Quil is a drawing and animation library for clojure. It is basically wrapper over Processing. Currently Quil works only on vanilla clojure (JVM based). It would be cool to have it also on ClojureScript. Processing already have javascript version: Processing.js, so it can be used for our goals.

Expected results: quil clojurescript library capable of running regular quil sketches, documentation how to use it in clojurescript project.

Tooling

Dynalint: Improved Core Clojure errors and warnings

Brief explanation: Error reporting has been identified as a common complaint of Clojure in the latest Clojure Survey. In many cases, addressing these concerns directly in the core Clojure implementation would degrade performance, while an explicit "strict" or debug mode for Clojure would require extensive changes to Clojure core. Dynalint takes another approach: it is an external tool that can "instrument" core Clojure functionality to emit warnings and better errors. This approach has some limitations, but it can quickly make headway in an area that Clojure struggles with.

Expected results: A comprehensive suite of useful warnings and errors for the (near) latest version/s of Clojure.