jank строится на основе Clojure

Сохраняй существующий код, открывай доступ к миру нативных технологий

jank — это Clojure

jank является полноценным диалектом Clojure, но с интероперабельностью C++ вместо Java. Язык предусматривает условную директиву :jank для случаев, когда это необходимо.

jank — это C++

jank может подключать любой исходный код C++, линковаться с любыми библиотеками C или C++, а также использует систему типов C++. Более того, jank компилируется в C++.

Инструментарий, вдохновленный Cargo

jank использует управление проектами на основе Leiningen и включает развитую систему сборки для нативного кода. Добавление зависимостей C и C++ в проект занимает всего одну строку.

REPL и native JIT-компилятор

Можно использовать любой плагин редактора для nREPL. jank содержит JIT-runtime на основе LLVM, который компилирует код C++ на лету.

Нативные зависимости — просто и удобно

jank привносит UX, вдохновленный Cargo, в мир C++ и Clojure

Простое управление проектами

Встроенная система сборки jank может находить установленные нативные зависимости или собирать их из исходников. Добавление новой зависимости требует изменения всего одной строки.

(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 идеален для разработки игр

jank привносит функциональное программирование, неизменяемые данные и REPL-driven development в процесс разработки игр. При необходимости дополнительной производительности всегда можно обратиться к C++ без мостов, регистрации типов, маршалирования и callbacks.

(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)))

Приятная AOT-компиляция

Экспериментируй столько, сколько хочешь, но генерируй компактный бинарник, когда будешь готов

Запуск происходит мгновенно

Спонсоры jank

Эти организации инвестируют в будущее jank. Присоединиться можно здесь.