Иногда нужно дать пользователям или операторам возможность менять поведение программы без пересборки — конфиги не всегда справляются, а встраивать Lua кажется чужеродным.
let-go предлагает другой вариант: язык в духе Clojure, написанный на Go и встраиваемый прямо в приложение.
Что это такое
let-go — это компилятор байткода и виртуальная машина для языка, который вплотную копирует Clojure. Реализован на Go, распространяется как обычный модуль.
Это не замена оригинального Clojure и не инструмент для его форматирования, а именно встраиваемый язык расширения.
Статус проекта — WIP, но уже работающий: автор решал на нём задачи Advent of Code 2022.
Что уже есть
Из реализованного: макросы с syntax quote, деструктуризация, функции с несколькими арностями, атомы, каналы и go-блоки в стиле
core.async, регулярные выражения, простые пространства имён json, http и os, REPL с подсветкой синтаксиса и автодополнением, базовый nREPL-сервер совместимый с Calva.Установка и запуск
go install github.com/nooga/let-go@latest
Запустить REPL:
let-go
Выполнить выражение напрямую:
let-go -e '(+ 1 1)'
Запустить файл:
let-go test/hello.lg
Запустить файл, а потом открыть REPL:
let-go -r test/simple.lg
Как выглядит код
Синтаксис — чистый Clojure. Пример с каналами и go-блоками:
(def ch (chan 10))
(go (>! ch "hello from goroutine"))
(println (<! ch))
Деструктуризация и работа со списками:
(let [[a b & rest] [1 2 3 4 5]]
(println a b rest))
; => 1 2 (3 4 5)
➡️ Попробовать без установки | Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
