jank programmeertaal - Clojure/LLVM/C++

jank is een robuust Clojure-dialect dat interactieve, REPL-gestuurde ontwikkeling biedt, aangedreven door een Clang-gebaseerde C++ JIT-compiler.

(ns my.app.filesystem
  (:include "boost/filesystem.hpp")
  (:refer-global :rename {boost.filesystem.file_size file-size}))

(defn file-info [file-path]
  (try
    (let [bytes (file-size (cpp/cast std.string file-path))]
      {:path file-path
       :size bytes})
    (catch boost.filesystem.filesystem_error e
      {:path file-path
       :error (.what e)})))

(file-info "/etc/passwd")
; {:path "/etc/passwd", :size 4025}

(file-info "/root/.bash_history")
; {:path "/root/.bash_history"
;  :error "boost::filesystem::file_size: Permission denied [system:13]: \"/root/.bash_history\""}

jank bouwt voort op Clojure

Behoud je bestaande code en ontsluit de native wereld.

jank is Clojure

jank is een volledig Clojure-dialect, maar met C++-interop in plaats van Java-interop. Er is een :jank reader conditional beschikbaar voor situaties waarin dit nodig is.

jank is C++

jank kan elke C++-broncode includeren, koppelen aan elke C- of C++-bibliotheek en maakt gebruik van het C++-typesysteem. jank compileert zelfs naar C++.

Tooling geïnspireerd op Cargo

jank maakt gebruik van Leiningen-gebaseerd projectbeheer en beschikt over een uitgebreid native bouwsysteem. Het is eenvoudig om C- en C++-afhankelijkheden aan je project toe te voegen.

REPL en native JIT-compiler

Gebruik je favoriete nREPL-editorplugin. jank bevat een LLVM-gebaseerde JIT-runtime om C++-code on the fly te compileren.

Native afhankelijkheden eenvoudig gemaakt

jank brengt een Cargo-geïnspireerde gebruikerservaring naar C++ en Clojure.

Eenvoudig projectbeheer

Het native bouwsysteem van jank kan je geïnstalleerde native afhankelijkheden vinden of ze vanuit de bron bouwen. Het toevoegen van een nieuwe afhankelijkheid is een wijziging in één regel.

(defproject imgui+glfw "0.1-SNAPSHOT"
  :dependencies [[org.jank-lang.commons/imgui-glfw-sys "2026.06-6"]
                [org.jank-lang.commons/imgui-opengl2-sys "2026.06-6"]
                [org.jank-lang.commons/gl-sys "2026.06-1"]]
  :plugins [[org.jank-lang/lein-jank "2026.06-2"]]
  :middleware [leiningen.jank/middleware]
  :main imgui+glfw.main
  :profiles {:base {:jank {:target-dir "target/debug"
                           :optimization-level 0}}
             :release {:jank {:target-dir "target/release"
                              :optimization-level 3}}})

jank is uitstekend voor game-ontwikkeling

jank brengt functionele, onveranderlijke data en REPL-gestuurde ontwikkeling naar je game-development workflow. Met jank kun je overschakelen naar C++ wanneer je extra prestaties wilt. Er zijn geen bridges, geen functie/type-registraties, geen marshalling en geen callbacks nodig.

(ns imgui+glfw.main
  (:include "GLFW/glfw3.h"
            "imgui.h" "imgui_impl_glfw.h" "imgui_impl_opengl2.h"))

(defn -main []
  (cpp/glfwInit)
  (let [window* (cpp/glfwCreateWindow 400 300
                                     "jank"
                                     cpp/nullptr cpp/nullptr)]
    (cpp/glfwMakeContextCurrent window*)
    (cpp/ImGui.CreateContext)
    (cpp/ImGui_ImplGlfw_InitForOpenGL window* true)
    (cpp/ImGui_ImplOpenGL2_Init)
    (while (cpp/! (cpp/glfwWindowShouldClose window*))
      (cpp/glfwPollEvents)
      (cpp/ImGui_ImplOpenGL2_NewFrame)
      (cpp/ImGui_ImplGlfw_NewFrame)
      (cpp/ImGui.NewFrame)
      (when (cpp/ImGui.Begin "jank")
        (cpp/ImGui.Text "Hello, jank and imgui!"))
      (cpp/ImGui.End)
      (cpp/ImGui.Render)
      (cpp/ImGui_ImplOpenGL2_RenderDrawData (cpp/ImGui.GetDrawData))
      (cpp/glfwSwapBuffers window*))
    (cpp/glfwTerminate)))

Uitstekende AOT-compilatie

Experimenteer zoveel je wilt, maar genereer een compact binair bestand wanneer je er klaar voor bent. De opstarttijd is onmiddellijk.