Glojure — это интерпретатор Clojure, написанный на Go. Он работает как «hosted» язык: все значения Go можно использовать как значения Glojure и наоборот. Проект ещё на ранней стадии — возможны баги и низкая производительность, обратная совместимость не гарантирована до v1. Но его уже применяют в хобби-проектах, и он выполняет большую часть трансформированной основной библиотеки Clojure.
Для работы нужен Go версии 1.19 или выше (сейчас минимум 1.24). Установка через go install github.com/glojurelang/glojure/cmd/glj@latest. После этого запускается REPL командой glj. В REPL доступны vi- и emacs-режимы, мультилайн, таб-дополнение, умные отступы, история команд (сохраняется в ~/.glj_history), работа с Ctrl+Z/Ctrl+C. Можно выполнять выражения прямо из командной строки через glj -e, запускать скрипты (glj hello.glj World) и создавать исполняемые программы, например HTTP-сервер.
Glojure можно встраивать в Go-приложения. Для этого подключается пакет github.com/glojurelang/glojure/pkg/runtime. Пример: вычислить факториал в одну строку. Go-функции передаются в Clojure через glj.Var, а Clojure-функции вызываются из Go через .Invoke. Это удобно для скриптовой конфигурации, плагинов или смешивания производительности Go с выразительностью Clojure.
Из коробки Glojure предоставляет интероп со многими пакетами стандартной библиотеки Go: bytes, context, errors, flag, fmt, io, io/fs, io/ioutil, math, math/big, math/rand, net/http, os, os/exec, os/signal, regexp, reflect, sort, strconv, strings, sync, sync/atomic, time, unicode. Имена пакетов преобразуются: слеш заменяется на двоеточие (например, net:http). Если нужны дополнительные пакеты, генерируется «package map» через утилиту gen-import-interop.
Типы данных отображаются: long → int64, double → float64, float → float32, byte → byte, short → int16, int → int (платформозависимый), char → lang.Char (обёртка над rune), BigInt → *lang.BigInt (обёртка *big.Int), BigDecimal → *lang.BigDecimal (обёртка *big.Float), Ratio → *lang.Ratio (обёртка *big.Rat), BigInteger → *big.Int.
Сравнение с другими Go-портами Clojure: Glojure — hosted, есть интероп и конкурентность, но нет тулинга (линтера). Joker не hosted, не имеет интеропа, но есть тулинг. let-go также не hosted, использует байткод-интерпретатор.