chore: rebrand Clojure/Nim → Bara Lang across codebase

- Bulk replace Clojure/Nim → Bara Lang in src/, lib/, examples/, benchmarks/,
  experiments/, books/, LICENSE, cljnim.nimble, PLAN.md, AI_AGENT.md
- Rename book chapters: 05-clojure-nim.md → 05-bara-lang.md (en + bg)
- Update all chapter index links and anchors
- Replace project-specific 'Clojure' references with 'Bara Lang' in
  experiments/, src/ai_assist.nim, src/tui_screens.nim, src/emitter.nim,
  src/reader.nim, src/types.nim, lib/cljnim_runtime*.nim
- Keep legitimate JVM Clojure/ClojureScript/Clojure CLR references intact
This commit is contained in:
2026-05-11 12:23:29 +03:00
parent 606605c95c
commit 79cd9c08d8
41 changed files with 128 additions and 128 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
## What is this project? ## What is this project?
**Clojure/Nim** is a Clojure dialect that compiles to Nim, then to C, then to native binaries. **Bara Lang** is a Clojure dialect that compiles to Nim, then to C, then to native binaries.
Current state: **Working compiler + REPL + macro system + file/git ops + Nim interop.** Current state: **Working compiler + REPL + macro system + file/git ops + Nim interop.**
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2026 Clojure/Nim Contributors Copyright (c) 2026 Bara Lang Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -1,4 +1,4 @@
# Clojure/Nim — Test Suite Compliance Plan # Bara Lang — Test Suite Compliance Plan
## Current Status: 233/233 (100%) ## Current Status: 233/233 (100%)
+2 -2
View File
@@ -31,7 +31,7 @@ run_aot_bench() {
echo "" echo ""
# Pre-compiled native binary # Pre-compiled native binary
echo " [Clojure/Nim AOT]" echo " [Bara Lang AOT]"
local nim_total=0 local nim_total=0
local nim_times=() local nim_times=()
for ((i=1; i<=runs; i++)); do for ((i=1; i<=runs; i++)); do
@@ -71,7 +71,7 @@ run_aot_bench() {
if [ $nim_avg -gt 0 ]; then if [ $nim_avg -gt 0 ]; then
local speedup=$((jvm_avg / nim_avg)) local speedup=$((jvm_avg / nim_avg))
echo " => Clojure/Nim AOT is ${speedup}x FASTER (avg)" echo " => Bara Lang AOT is ${speedup}x FASTER (avg)"
fi fi
else else
echo " [JVM Clojure] — not installed" echo " [JVM Clojure] — not installed"
+5 -5
View File
@@ -5,7 +5,7 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")" PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
echo "==============================================" echo "=============================================="
echo " Clojure/Nim vs JVM Clojure — Benchmarks" echo " Bara Lang vs JVM Clojure — Benchmarks"
echo "==============================================" echo "=============================================="
echo "" echo ""
@@ -17,8 +17,8 @@ run_bench() {
echo "--- $name ---" echo "--- $name ---"
echo "" echo ""
# Clojure/Nim # Bara Lang
echo " [Clojure/Nim]" echo " [Bara Lang]"
local nim_total=0 local nim_total=0
local nim_times=() local nim_times=()
for ((i=1; i<=runs; i++)); do for ((i=1; i<=runs; i++)); do
@@ -58,7 +58,7 @@ run_bench() {
if [ $jvm_avg -gt 0 ]; then if [ $jvm_avg -gt 0 ]; then
local speedup=$((jvm_avg / nim_avg)) local speedup=$((jvm_avg / nim_avg))
echo " => Clojure/Nim is ${speedup}x FASTER (avg)" echo " => Bara Lang is ${speedup}x FASTER (avg)"
fi fi
else else
echo " [JVM Clojure] — not installed, skipping" echo " [JVM Clojure] — not installed, skipping"
@@ -66,7 +66,7 @@ run_bench() {
echo "" echo ""
} }
echo "Building Clojure/Nim..." echo "Building Bara Lang..."
nim c -o:"$PROJECT_DIR/cljnim" "$PROJECT_DIR/src/cljnim.nim" 2>/dev/null nim c -o:"$PROJECT_DIR/cljnim" "$PROJECT_DIR/src/cljnim.nim" 2>/dev/null
echo "" echo ""
+7 -7
View File
@@ -1,10 +1,10 @@
# Clojure/Nim — The Native Clojure Book # Bara Lang — The Native Clojure Book
> A practical guide to Clojure that compiles to native binaries. No JVM required. > A practical guide to Clojure that compiles to native binaries. No JVM required.
## What You Will Learn ## What You Will Learn
This book teaches **Clojure** through the lens of **Clojure/Nim** — a real compiler that turns your Clojure code into native machine code via Nim and C. This book teaches **Clojure** through the lens of **Bara Lang** — a real compiler that turns your Clojure code into native machine code via Nim and C.
You do not need Java. You do not need Leiningen. You need Nim, a C compiler, and curiosity. You do not need Java. You do not need Leiningen. You need Nim, a C compiler, and curiosity.
@@ -16,7 +16,7 @@ You do not need Java. You do not need Leiningen. You need Nim, a C compiler, and
| [02 — Advanced](en/02-advanced.md) | Transducers, specs, parallelism, performance | Write code that scales. | | [02 — Advanced](en/02-advanced.md) | Transducers, specs, parallelism, performance | Write code that scales. |
| [03 — Tooling](en/03-tooling.md) | Project structure, deps, testing, debugging | Ship reliable software. | | [03 — Tooling](en/03-tooling.md) | Project structure, deps, testing, debugging | Ship reliable software. |
| [04 — Recipes](en/04-recipes.md) | Common patterns, state management, APIs | Copy-paste solutions that work. | | [04 — Recipes](en/04-recipes.md) | Common patterns, state management, APIs | Copy-paste solutions that work. |
| **[05 — Clojure/Nim](en/05-clojure-nim.md)** | **Native compilation, AI integration, JSON REPL, WASM** | **What makes this dialect unique.** | | **[05 — Bara Lang](en/05-bara-lang.md)** | **Native compilation, AI integration, JSON REPL, WASM** | **What makes this dialect unique.** |
## Quick Start ## Quick Start
@@ -29,7 +29,7 @@ make build && make check
## Running the Examples ## Running the Examples
Most examples work in any Clojure REPL. Chapter 5 examples are specific to Clojure/Nim: Most examples work in any Clojure REPL. Chapter 5 examples are specific to Bara Lang:
```bash ```bash
# Human REPL # Human REPL
@@ -53,9 +53,9 @@ Most examples work in any Clojure REPL. Chapter 5 examples are specific to Cloju
## Stats ## Stats
- **8 chapters** (4 core + 4 translated) - **8 chapters** (4 core + 4 translated)
- **1 new chapter** on Clojure/Nim (native compilation, AI, cross-targets) - **1 new chapter** on Bara Lang (native compilation, AI, cross-targets)
- **All code tested** against Clojure/Nim v0.1.0 - **All code tested** against Bara Lang v0.1.0
--- ---
*This book is maintained as part of the Clojure/Nim project.* *This book is maintained as part of the Bara Lang project.*
@@ -1,12 +1,12 @@
# Clojure/Nim: Native Clojure # Bara Lang: Native Clojure
> Същият език, който обичаш. Компилиран до нативен код. Без JVM. > Същият език, който обичаш. Компилиран до нативен код. Без JVM.
--- ---
## Какво е Clojure/Nim? ## Какво е Bara Lang?
**Clojure/Nim** е пълен диалект на Clojure, който се компилира до нативен машинен код през Nim компилатора. Това не е интерпретатор — това е истински компилатор с пълен pipeline за оптимизация: **Bara Lang** е пълен диалект на Clojure, който се компилира до нативен машинен код през Nim компилатора. Това не е интерпретатор — това е истински компилатор с пълен pipeline за оптимизация:
``` ```
Твоят .clj файл Твоят .clj файл
@@ -26,7 +26,7 @@
### Защо native? ### Защо native?
| JVM Clojure | Clojure/Nim | | JVM Clojure | Bara Lang |
|-------------|-------------| |-------------|-------------|
| Нуждае се от Java runtime | Самостоятелен бинарен файл | | Нуждае се от Java runtime | Самостоятелен бинарен файл |
| ~2-5 секунди startup | Мигновен старт | | ~2-5 секунди startup | Мигновен старт |
@@ -112,7 +112,7 @@ JSON REPL е проектиран за програмно взаимодейст
## AI-асистирана разработка ## AI-асистирана разработка
Clojure/Nim е първата Clojure имплементация, в която AI асистенцията е първокласна функция. Bara Lang е първата Clojure имплементация, в която AI асистенцията е първокласна функция.
### Обяснение на грешки ### Обяснение на грешки
@@ -154,7 +154,7 @@ export DEEPSEEK_API_KEY="sk-..."
## `loop` / `recur`: Истинска TCO ## `loop` / `recur`: Истинска TCO
За разлика от JVM Clojure (който използва `recur`, за да избегне stack overflow, но все пак работи върху stack-based VM), Clojure/Nim компилира `loop`/`recur` до native `while` цикъл: За разлика от JVM Clojure (който използва `recur`, за да избегне stack overflow, но все пак работи върху stack-based VM), Bara Lang компилира `loop`/`recur` до native `while` цикъл:
```clojure ```clojure
(defn factorial [n] (defn factorial [n]
@@ -170,7 +170,7 @@ export DEEPSEEK_API_KEY="sk-..."
## Cross-Compilation Target-и ## Cross-Compilation Target-и
Clojure/Nim може да таргетира множество платформи от един и същи изходен код: Bara Lang може да таргетира множество платформи от един и същи изходен код:
### Нативен бинарен файл (по подразбиране) ### Нативен бинарен файл (по подразбиране)
```bash ```bash
@@ -201,7 +201,7 @@ nim c -d:release --cpu:wasm32 --os:linux program.nim
## Persistent Структури от Данни ## Persistent Структури от Данни
Clojure/Nim имплементира истински **Hash Array Mapped Trie (HAMT)** вектори и карти: Bara Lang имплементира истински **Hash Array Mapped Trie (HAMT)** вектори и карти:
```clojure ```clojure
(def v (vector 1 2 3)) (def v (vector 1 2 3))
@@ -263,9 +263,9 @@ Threading макроси, `when-let`, `cond`, `doto`, `some->` — всички
--- ---
## Кога да използваш Clojure/Nim ## Кога да използваш Bara Lang
| Use Case | Clojure/JVM | Clojure/Nim | | Use Case | Clojure/JVM | Bara Lang |
|----------|-------------|-------------| |----------|-------------|-------------|
| Големи уеб услуги | ✅ | ⚠️ (ранен етап) | | Големи уеб услуги | ✅ | ⚠️ (ранен етап) |
| CLI инструменти | ⚠️ (бавен старт) | ✅ (мигновен) | | CLI инструменти | ⚠️ (бавен старт) | ✅ (мигновен) |
@@ -286,4 +286,4 @@ Threading макроси, `when-let`, `cond`, `doto`, `some->` — всички
--- ---
*Clojure/Nim е доказателство, че не ти трябва виртуална машина, за да пишеш елегантен, функционален, immutable код. Трябва ти само добър компилатор.* *Bara Lang е доказателство, че не ти трябва виртуална машина, за да пишеш елегантен, функционален, immutable код. Трябва ти само добър компилатор.*
+5 -5
View File
@@ -8,11 +8,11 @@
- **Анонимни функции** - [5.2](bg/01-fundamentals.md#52-анонимни-функции) - **Анонимни функции** - [5.2](bg/01-fundamentals.md#52-анонимни-функции)
- **Аритности** - [5.1.2](bg/01-fundamentals.md#512-множество-арности) - **Аритности** - [5.1.2](bg/01-fundamentals.md#512-множество-арности)
- **Асинхронно програмиране** - [16](bg/01-fundamentals.md#16-coreasync), [4](bg/04-recipes.md#4-async-рецепти) - **Асинхронно програмиране** - [16](bg/01-fundamentals.md#16-coreasync), [4](bg/04-recipes.md#4-async-рецепти)
- **Атом (Atom)** - [11.1](bg/01-fundamentals.md#11-атоми-atoms), [5](bg/05-clojure-nim.md#конкурентност) - **Атом (Atom)** - [11.1](bg/01-fundamentals.md#11-атоми-atoms), [5](bg/05-bara-lang.md#конкурентност)
- **AI интеграция** - [5](bg/05-clojure-nim.md#ai-асистирана-разработка) - **AI интеграция** - [5](bg/05-bara-lang.md#ai-асистирана-разработка)
- **AI агенти** - [5](bg/05-clojure-nim.md#json-repl-за-ai-агенти) - **AI агенти** - [5](bg/05-bara-lang.md#json-repl-за-ai-агенти)
- **Clojure/Nim** - [5](bg/05-clojure-nim.md) — Нативна компилация, AI, JSON REPL - **Bara Lang** - [5](bg/05-bara-lang.md) — Нативна компилация, AI, JSON REPL
- **Cross-compilation** - [5](bg/05-clojure-nim.md#cross-compilation-target-и) — JS, WASM, shared libraries - **Cross-compilation** - [5](bg/05-bara-lang.md#cross-compilation-target-и) — JS, WASM, shared libraries
## Б ## Б
@@ -1,12 +1,12 @@
# Clojure/Nim: Native Clojure # Bara Lang: Native Clojure
> The same language you love. Compiled to native binaries. No JVM required. > The same language you love. Compiled to native binaries. No JVM required.
--- ---
## What is Clojure/Nim? ## What is Bara Lang?
**Clojure/Nim** is a complete Clojure dialect that compiles to native machine code via the Nim compiler. It is not an interpreter — it is a real compiler with a full optimization pipeline: **Bara Lang** is a complete Clojure dialect that compiles to native machine code via the Nim compiler. It is not an interpreter — it is a real compiler with a full optimization pipeline:
``` ```
Your .clj file Your .clj file
@@ -26,7 +26,7 @@ The result is a single executable file, often under **1 MB**, that starts instan
### Why Native? ### Why Native?
| JVM Clojure | Clojure/Nim | | JVM Clojure | Bara Lang |
|-------------|-------------| |-------------|-------------|
| Needs Java runtime installed | Self-contained binary | | Needs Java runtime installed | Self-contained binary |
| ~2-5 second startup time | Instant startup | | ~2-5 second startup time | Instant startup |
@@ -112,7 +112,7 @@ The JSON REPL is designed for programmatic interaction. Every operation has stru
## AI-Powered Development ## AI-Powered Development
Clojure/Nim is the first Clojure implementation built with AI assistance as a first-class feature. Bara Lang is the first Clojure implementation built with AI assistance as a first-class feature.
### Error Explanation ### Error Explanation
@@ -154,7 +154,7 @@ export DEEPSEEK_API_KEY="sk-..."
## `loop` / `recur`: Real TCO ## `loop` / `recur`: Real TCO
Unlike JVM Clojure (which uses `recur` to avoid stack overflow but still runs on a stack-based VM), Clojure/Nim compiles `loop`/`recur` to a native `while` loop: Unlike JVM Clojure (which uses `recur` to avoid stack overflow but still runs on a stack-based VM), Bara Lang compiles `loop`/`recur` to a native `while` loop:
```clojure ```clojure
(defn factorial [n] (defn factorial [n]
@@ -170,7 +170,7 @@ This generates efficient C code with no function calls. It is **genuinely O(1) s
## Cross-Compilation Targets ## Cross-Compilation Targets
Clojure/Nim can target multiple platforms from the same source: Bara Lang can target multiple platforms from the same source:
### Native Binary (default) ### Native Binary (default)
```bash ```bash
@@ -202,7 +202,7 @@ This is something JVM Clojure simply cannot do.
## Persistent Data Structures ## Persistent Data Structures
Clojure/Nim implements real **Hash Array Mapped Trie (HAMT)** vectors and maps: Bara Lang implements real **Hash Array Mapped Trie (HAMT)** vectors and maps:
```clojure ```clojure
(def v (vector 1 2 3)) (def v (vector 1 2 3))
@@ -264,9 +264,9 @@ Threading macros, `when-let`, `cond`, `doto`, `some->` — all implemented as re
--- ---
## When to Use Clojure/Nim ## When to Use Bara Lang
| Use Case | Clojure/JVM | Clojure/Nim | | Use Case | Clojure/JVM | Bara Lang |
|----------|-------------|-------------| |----------|-------------|-------------|
| Large web services | ✅ | ⚠️ (early stage) | | Large web services | ✅ | ⚠️ (early stage) |
| CLI tools | ⚠️ (slow startup) | ✅ (instant) | | CLI tools | ⚠️ (slow startup) | ✅ (instant) |
@@ -287,4 +287,4 @@ Threading macros, `when-let`, `cond`, `doto`, `some->` — all implemented as re
--- ---
*Clojure/Nim is proof that you do not need a virtual machine to write elegant, functional, immutable code. You just need a good compiler.* *Bara Lang is proof that you do not need a virtual machine to write elegant, functional, immutable code. You just need a good compiler.*
+4 -4
View File
@@ -24,10 +24,10 @@
- **Caching** - [1.5](en/01-fundamentals.md#15-memoization), [8.6](en/02-advanced.md#86-preload-and-cache), [8.2](en/04-recipes.md#82-caching-with-ttl) - **Caching** - [1.5](en/01-fundamentals.md#15-memoization), [8.6](en/02-advanced.md#86-preload-and-cache), [8.2](en/04-recipes.md#82-caching-with-ttl)
- **Case** - [6.1.5](en/01-fundamentals.md#615-case) - **Case** - [6.1.5](en/01-fundamentals.md#615-case)
- **Channels** - [16.1](en/01-fundamentals.md#161-channels), [5](en/05-clojure-nim.md#concurrency) - **Channels** - [16.1](en/01-fundamentals.md#161-channels), [5](en/05-bara-lang.md#concurrency)
- **Clojure/Nim** - [5](en/05-clojure-nim.md) — Native compilation, AI integration, JSON REPL - **Bara Lang** - [5](en/05-bara-lang.md) — Native compilation, AI integration, JSON REPL
- **Compilation (native)** - [5](en/05-clojure-nim.md#what-is-clojure-nim) - **Compilation (native)** - [5](en/05-bara-lang.md#what-is-bara-lang)
- **Cross-compilation** - [5](en/05-clojure-nim.md#cross-compilation-targets) — JS, WASM, shared libraries - **Cross-compilation** - [5](en/05-bara-lang.md#cross-compilation-targets) — JS, WASM, shared libraries
- **Characters** - [4.3](en/01-fundamentals.md#43-characters) - **Characters** - [4.3](en/01-fundamentals.md#43-characters)
- **Chunked sequences** - [2.2](en/02-advanced.md#22-chunked-sequences) - **Chunked sequences** - [2.2](en/02-advanced.md#22-chunked-sequences)
- **Circuit breaker** - [3.4](en/04-recipes.md#34-circuit-breaker) - **Circuit breaker** - [3.4](en/04-recipes.md#34-circuit-breaker)
+1 -1
View File
@@ -1,6 +1,6 @@
# Package # Package
version = "0.1.0" version = "0.1.0"
author = "Clojure/Nim Team" author = "Bara Lang Team"
description = "Clojure dialect compiling to Nim" description = "Clojure dialect compiling to Nim"
license = "MIT" license = "MIT"
srcDir = "src" srcDir = "src"
+2 -2
View File
@@ -1,10 +1,10 @@
; AI-Native Tooling Demo ; AI-Native Tooling Demo
; File and Git operations from Clojure ; File and Git operations from Bara Lang
(println "=== File Operations ===") (println "=== File Operations ===")
; Write a file ; Write a file
(file/write "/tmp/ai_demo.txt" "Hello from Clojure/Nim AI!") (file/write "/tmp/ai_demo.txt" "Hello from Bara Lang AI!")
; Read it back ; Read it back
(println (file/read "/tmp/ai_demo.txt")) (println (file/read "/tmp/ai_demo.txt"))
+1 -1
View File
@@ -1,4 +1,4 @@
; C FFI — Достъп до C функции директно от Clojure ; C FFI — Достъп до C функции директно от Bara Lang
; (c-fn sin "math.h" :double [:double]) ; (c-fn sin "math.h" :double [:double])
; Това генерира Nim proc с {.importc.} pragma ; Това генерира Nim proc с {.importc.} pragma
+1 -1
View File
@@ -1,3 +1,3 @@
; First Clojure/Nim program ; First Bara Lang program
(println "Hello, Nim world!") (println "Hello, Nim world!")
(println (+ 1 2 3)) (println (+ 1 2 3))
+2 -2
View File
@@ -1,10 +1,10 @@
; jsonista.clj — Production JSON library example for Clojure/Nim ; jsonista.clj — Production JSON library example for Bara Lang
; Modeled after https://github.com/metosin/jsonista ; Modeled after https://github.com/metosin/jsonista
; Replaces Java/Jackson dependencies with native Nim JSON performance ; Replaces Java/Jackson dependencies with native Nim JSON performance
; ;
; This example demonstrates: ; This example demonstrates:
; - Fast JSON encoding/decoding without JVM overhead ; - Fast JSON encoding/decoding without JVM overhead
; - Keyword keys support (Clojure idiomatic) ; - Keyword keys support (Bara Lang idiomatic)
; - File I/O ; - File I/O
; - Pretty printing ; - Pretty printing
; - Complex nested data structures ; - Complex nested data structures
+7 -7
View File
@@ -1,4 +1,4 @@
# jsonista.clj — Production JSON библиотека за Clojure/Nim # jsonista.clj — Production JSON библиотека за Bara Lang
> Моделирана след [metosin/jsonista](https://github.com/metosin/jsonista), но с **нула Java зависимости**. > Моделирана след [metosin/jsonista](https://github.com/metosin/jsonista), но с **нула Java зависимости**.
@@ -6,7 +6,7 @@
Този пример демонстрира пълноценна JSON библиотека с API идентично на jsonista, но: Този пример демонстрира пълноценна JSON библиотека с API идентично на jsonista, но:
| | JVM jsonista | Clojure/Nim jsonista | | | JVM jsonista | Bara Lang jsonista |
|---|---|---| |---|---|---|
| JVM зависимост | ✅ Required (JVM + Jackson) | ❌ Няма | | JVM зависимост | ✅ Required (JVM + Jackson) | ❌ Няма |
| Jackson/databind | ✅ Required | ❌ Няма | | Jackson/databind | ✅ Required | ❌ Няма |
@@ -21,8 +21,8 @@
; Основни функции ; Основни функции
(json/write-value-as-string data) ; -> JSON string (json/write-value-as-string data) ; -> JSON string
(json/write-value-as-string data opts) ; -> JSON string с опции (json/write-value-as-string data opts) ; -> JSON string с опции
(json/read-value json-string) ; -> Clojure data (json/read-value json-string) ; -> Bara Lang data
(json/read-value json-string opts) ; -> Clojure data с опции (json/read-value json-string opts) ; -> Bara Lang data с опции
(json/write-value-to-file path data) ; -> записва във файл (json/write-value-to-file path data) ; -> записва във файл
(json/write-value-to-file path data opts) ; -> записва във файл (json/write-value-to-file path data opts) ; -> записва във файл
(json/read-value-from-file path) ; -> чете от файл (json/read-value-from-file path) ; -> чете от файл
@@ -86,7 +86,7 @@
``` ```
Clojure code Clojure code
Clojure/Nim Compiler Bara Lang Compiler
Nim код + cljnim_runtime (std/json) Nim код + cljnim_runtime (std/json)
@@ -127,7 +127,7 @@ make check
## Сравнение с оригиналния jsonista ## Сравнение с оригиналния jsonista
| Feature | JVM jsonista | Clojure/Nim | | Feature | JVM jsonista | Bara Lang |
|---|---|---| |---|---|---|
| `write-value-as-string` | ✅ | ✅ | | `write-value-as-string` | ✅ | ✅ |
| `read-value` | ✅ | ✅ | | `read-value` | ✅ | ✅ |
@@ -140,4 +140,4 @@ make check
--- ---
**Извод:** С Clojure/Nim получаваш същото production-ready JSON API, но без целия Java overhead — native бинарен файл, мигновен старт, и достъп до цялата Nim/C ecosystem. **Извод:** С Bara Lang получаваш същото production-ready JSON API, но без целия Java overhead — native бинарен файл, мигновен старт, и достъп до цялата Nim/C ecosystem.
+8 -8
View File
@@ -1,4 +1,4 @@
# Clojure/Nim Experiments # Bara Lang Experiments
Unconventional compilation targets that JVM Clojure cannot do. Unconventional compilation targets that JVM Clojure cannot do.
@@ -10,7 +10,7 @@ Unconventional compilation targets that JVM Clojure cannot do.
| `native-lib/` | ✅ Working | Clojure → Nim → C shared library (.so) | | `native-lib/` | ✅ Working | Clojure → Nim → C shared library (.so) |
| `wasm-target/` | 🏗️ Skeleton | Clojure → Nim → WASM via Emscripten | | `wasm-target/` | 🏗️ Skeleton | Clojure → Nim → WASM via Emscripten |
## web-target — Clojure in the Browser ## web-target — Bara Lang in the Browser
```bash ```bash
cd web-target cd web-target
@@ -19,9 +19,9 @@ node -e "require('./build/math.js'); console.log(jsSquare(7))"
# → 49 # → 49
``` ```
**Unique:** No JVM, no JavaScript source code — pure Clojure compiled to JS. **Unique:** No JVM, no JavaScript source code — pure Bara Lang compiled to JS.
## native-lib — Clojure as a C Library ## native-lib — Bara Lang as a C Library
```bash ```bash
cd native-lib cd native-lib
@@ -31,9 +31,9 @@ cd test_client && make && LD_LIBRARY_PATH=../build ./test_client
# → c_factorial(5) = 120 # → c_factorial(5) = 120
``` ```
**Unique:** Call Clojure functions from Python, Rust, Go, C via FFI. **Unique:** Call Bara Lang functions from Python, Rust, Go, C via FFI.
## wasm-target — Clojure at Native Speed in Browser ## wasm-target — Bara Lang at Native Speed in Browser
```bash ```bash
cd wasm-target cd wasm-target
@@ -42,14 +42,14 @@ cd wasm-target
# Open www/index.html in browser # Open www/index.html in browser
``` ```
**Unique:** Clojure running as WebAssembly — faster than ClojureScript, smaller than JVM. **Unique:** Bara Lang running as WebAssembly — faster than ClojureScript, smaller than JVM.
## Architecture ## Architecture
All experiments share the same pipeline: All experiments share the same pipeline:
``` ```
Clojure Source (.clj) Bara Lang Source (.clj)
cljnim compile-lib cljnim compile-lib
+4 -4
View File
@@ -1,12 +1,12 @@
# Clojure/Nim → Native Shared Library # Bara Lang → Native Shared Library
Compile Clojure code to a C shared library (`.so` / `.dll` / `.dylib`). Compile Bara Lang code to a C shared library (`.so` / `.dll` / `.dylib`).
## Why? ## Why?
- **Embed Clojure in Python/Rust/Go/C** via FFI - **Embed Bara Lang in Python/Rust/Go/C** via FFI
- **Tiny binaries** — no JVM overhead - **Tiny binaries** — no JVM overhead
- **True C ABI** — call Clojure functions from any language - **True C ABI** — call Bara Lang functions from any language
## Quick Start ## Quick Start
+1 -1
View File
@@ -1,4 +1,4 @@
# Generated by Clojure/Nim # Generated by Bara Lang
import cljnim_runtime import cljnim_runtime
proc square*(x: CljVal): CljVal = proc square*(x: CljVal): CljVal =
+2 -2
View File
@@ -1,9 +1,9 @@
# C-friendly wrappers around Clojure-generated code # C-friendly wrappers around Bara Lang-generated code
# Exports plain C types (int, char*) instead of CljVal # Exports plain C types (int, char*) instead of CljVal
import cljnim_runtime import cljnim_runtime
# Import the generated Clojure functions # Import the generated Bara Lang functions
include build/math include build/math
proc c_square*(x: cint): cint {.exportc, dynlib.} = proc c_square*(x: cint): cint {.exportc, dynlib.} =
+2 -2
View File
@@ -12,13 +12,13 @@ extern void NimMain(void);
int main(void) { int main(void) {
NimMain(); NimMain();
printf("=== Clojure/Nim Native Library Test ===\n\n"); printf("=== Bara Lang Native Library Test ===\n\n");
printf("c_square(7) = %d\n", c_square(7)); printf("c_square(7) = %d\n", c_square(7));
printf("c_add(10, 20) = %d\n", c_add(10, 20)); printf("c_add(10, 20) = %d\n", c_add(10, 20));
printf("c_factorial(5) = %d\n", c_factorial(5)); printf("c_factorial(5) = %d\n", c_factorial(5));
printf("c_greet(\"World\") = %s\n", c_greet("World")); printf("c_greet(\"World\") = %s\n", c_greet("World"));
printf("\nAll tests passed! Clojure in a .so file.\n"); printf("\nAll tests passed! Bara Lang in a .so file.\n");
return 0; return 0;
} }
+3 -3
View File
@@ -1,6 +1,6 @@
# Clojure/Nim → WASM (via Emscripten) # Bara Lang → WASM (via Emscripten)
Compile Clojure code to WebAssembly using Nim's Emscripten backend. Compile Bara Lang code to WebAssembly using Nim's Emscripten backend.
## Why? ## Why?
@@ -31,7 +31,7 @@ Then open `www/index.html` in a browser.
1. `cljnim compile-lib` — generates Nim with exported functions 1. `cljnim compile-lib` — generates Nim with exported functions
2. `nim c -d:emscripten` — compiles Nim to WASM + JS glue 2. `nim c -d:emscripten` — compiles Nim to WASM + JS glue
3. Browser loads `math.js` (glue) + `math.wasm` (WASM module) 3. Browser loads `math.js` (glue) + `math.wasm` (WASM module)
4. JS calls `_wasmSquare(7)` → WASM executes native Clojure code 4. JS calls `_wasmSquare(7)` → WASM executes native Bara Lang code
## Future ## Future
+1 -1
View File
@@ -1,4 +1,4 @@
# WASM-friendly wrappers around Clojure-generated code # WASM-friendly wrappers around Bara Lang-generated code
# Uses Emscripten FFI: cint → JS number, cstring → JS string # Uses Emscripten FFI: cint → JS number, cstring → JS string
import cljnim_runtime import cljnim_runtime
+4 -4
View File
@@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Clojure/Nim → WASM Demo</title> <title>Bara Lang → WASM Demo</title>
<style> <style>
body { font-family: monospace; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a2e; color: #eee; } body { font-family: monospace; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a2e; color: #eee; }
h1 { color: #e94560; } h1 { color: #e94560; }
@@ -10,8 +10,8 @@
</style> </style>
</head> </head>
<body> <body>
<h1>Clojure/Nim → WASM (Emscripten)</h1> <h1>Bara Lang → WASM (Emscripten)</h1>
<p>Clojure compiled to Nim, then to WebAssembly via Emscripten.</p> <p>Bara Lang compiled to Nim, then to WebAssembly via Emscripten.</p>
<div class="result"> <div class="result">
<div id="output">Loading WASM module...</div> <div id="output">Loading WASM module...</div>
@@ -25,7 +25,7 @@
<b>wasmSquare(7)</b> = ${Module._wasmSquare(7)}<br> <b>wasmSquare(7)</b> = ${Module._wasmSquare(7)}<br>
<b>wasmFactorial(5)</b> = ${Module._wasmFactorial(5)}<br> <b>wasmFactorial(5)</b> = ${Module._wasmFactorial(5)}<br>
<br> <br>
<i>Clojure running at native speed in your browser!</i> <i>Bara Lang running at native speed in your browser!</i>
`; `;
} }
}; };
+4 -4
View File
@@ -1,11 +1,11 @@
# Clojure/Nim → JavaScript # Bara Lang → JavaScript
Compile Clojure code to JavaScript via Nim's JS backend. Compile Bara Lang code to JavaScript via Nim's JS backend.
## Why? ## Why?
- **No JVM** — Clojure in the browser without 50MB runtime - **No JVM** — Bara Lang in the browser without 50MB runtime
- **No JavaScript** — write Clojure, get JS - **No JavaScript** — write Bara Lang, get JS
- **Smaller than ClojureScript** — no Google Closure compiler needed - **Smaller than ClojureScript** — no Google Closure compiler needed
## Quick Start ## Quick Start
+1 -1
View File
@@ -1,4 +1,4 @@
# Generated by Clojure/Nim # Generated by Bara Lang
import cljnim_runtime_js import cljnim_runtime_js
proc square*(x: CljVal): CljVal = proc square*(x: CljVal): CljVal =
+2 -2
View File
@@ -1,9 +1,9 @@
# JS-friendly wrappers around Clojure-generated code # JS-friendly wrappers around Bara Lang-generated code
# These expose plain JS types (number, string) instead of CljVal # These expose plain JS types (number, string) instead of CljVal
import cljnim_runtime_js import cljnim_runtime_js
# Import the generated Clojure functions # Import the generated Bara Lang functions
include build/math include build/math
proc jsSquare*(x: int): int {.exportc.} = proc jsSquare*(x: int): int {.exportc.} =
+3 -3
View File
@@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Clojure/Nim → JS Demo</title> <title>Bara Lang → JS Demo</title>
<style> <style>
body { font-family: monospace; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a2e; color: #eee; } body { font-family: monospace; max-width: 800px; margin: 40px auto; padding: 20px; background: #1a1a2e; color: #eee; }
h1 { color: #e94560; } h1 { color: #e94560; }
@@ -14,8 +14,8 @@
</style> </style>
</head> </head>
<body> <body>
<h1>🔥 Clojure/Nim → JavaScript</h1> <h1>🔥 Bara Lang → JavaScript</h1>
<p>Clojure code compiled to Nim, then to JavaScript. Running in your browser.</p> <p>Bara Lang code compiled to Nim, then to JavaScript. Running in your browser.</p>
<div class="result"> <div class="result">
<div class="label">square(7)</div> <div class="label">square(7)</div>
+1 -1
View File
@@ -1,4 +1,4 @@
# Simplified core.async for Clojure/Nim # Simplified core.async for Bara Lang
# Provides channels with put!/take!/close! and go blocks # Provides channels with put!/take!/close! and go blocks
import deques, locks import deques, locks
+1 -1
View File
@@ -1,5 +1,5 @@
# Persistent Map — Hash Array Mapped Trie (HAMT) # Persistent Map — Hash Array Mapped Trie (HAMT)
# Clojure-style 32-way branching with structural sharing # Bara Lang-style 32-way branching with structural sharing
# Takes pre-computed hashes and equality functions from callers # Takes pre-computed hashes and equality functions from callers
import hashes import hashes
+1 -1
View File
@@ -1,5 +1,5 @@
# Persistent Vector — Hash Array Mapped Trie # Persistent Vector — Hash Array Mapped Trie
# Clojure-style 32-way branching with structural sharing # Bara Lang-style 32-way branching with structural sharing
type type
PVecNode*[T] = ref object PVecNode*[T] = ref object
+1 -1
View File
@@ -481,7 +481,7 @@ proc cljNumEq*(args: seq[CljVal]): CljVal =
cljBool(true) cljBool(true)
proc cljEqual*(a, b: CljVal): bool = proc cljEqual*(a, b: CljVal): bool =
## Clojure = equality: structural equality for all types, numeric equality for numbers ## Bara Lang = equality: structural equality for all types, numeric equality for numbers
if a.isNil and b.isNil: return true if a.isNil and b.isNil: return true
if a.isNil or b.isNil: return false if a.isNil or b.isNil: return false
if a.kind != b.kind: if a.kind != b.kind:
+1 -1
View File
@@ -1,4 +1,4 @@
# Minimal Clojure runtime for JavaScript target # Minimal Bara Lang runtime for JavaScript target
# No C FFI, no threads, no processes — just plain Nim/JS # No C FFI, no threads, no processes — just plain Nim/JS
type type
+10 -10
View File
@@ -1,4 +1,4 @@
# AI Assistance for Clojure/Nim Compiler # AI Assistance for Bara Lang Compiler
# Supports DeepSeek API and OpenAI-compatible APIs (Xiaomi MiMo, etc.) # Supports DeepSeek API and OpenAI-compatible APIs (Xiaomi MiMo, etc.)
# API keys are read from environment variables — never hardcoded. # API keys are read from environment variables — never hardcoded.
@@ -95,7 +95,7 @@ proc getCachedError*(errorMsg, fileName: string): string =
proc buildErrorPrompt*(errorMsg, sourceCode, fileName: string): string = proc buildErrorPrompt*(errorMsg, sourceCode, fileName: string): string =
## Build a prompt for the AI to analyze a compiler error ## Build a prompt for the AI to analyze a compiler error
result = """You are an expert Clojure/Nim compiler assistant. The user got a compilation error. result = """You are an expert Bara Lang compiler assistant. The user got a compilation error.
**File:** """ & fileName & """ **File:** """ & fileName & """
@@ -110,21 +110,21 @@ proc buildErrorPrompt*(errorMsg, sourceCode, fileName: string): string =
``` ```
Please explain the error in simple terms and suggest a fix. Keep your response under 200 words. Please explain the error in simple terms and suggest a fix. Keep your response under 200 words.
If the error is in Clojure code, show the corrected Clojure snippet. If the error is in Bara Lang code, show the corrected Bara Lang snippet.
Respond in the same language as the user's source code comments (Bulgarian or English). Respond in the same language as the user's source code comments (Bulgarian or English).
""" """
proc buildGenerationPrompt*(description: string): string = proc buildGenerationPrompt*(description: string): string =
## Build a prompt for AI code generation ## Build a prompt for AI code generation
result = """You are an expert Clojure programmer. Generate a Clojure function based on this description: result = """You are an expert Bara Lang programmer. Generate a Bara Lang function based on this description:
""" & description & """ """ & description & """
Requirements: Requirements:
- Use idiomatic Clojure - Use idiomatic Bara Lang
- Include docstring - Include docstring
- Use loop/recur instead of recursion if possible - Use loop/recur instead of recursion if possible
- Return ONLY the Clojure code, no explanations - Return ONLY the Bara Lang code, no explanations
""" """
proc buildOptimizationPrompt*(code: string): string = proc buildOptimizationPrompt*(code: string): string =
@@ -142,7 +142,7 @@ Consider:
- Transients for batch operations - Transients for batch operations
- Parallelization opportunities (pmap, reducers) - Parallelization opportunities (pmap, reducers)
Keep response under 200 words. Return ONLY Clojure code suggestions, no explanations. Keep response under 200 words. Return ONLY Bara Lang code suggestions, no explanations.
""" """
proc buildDebugPrompt*(code: string, evalResult: string): string = proc buildDebugPrompt*(code: string, evalResult: string): string =
@@ -216,19 +216,19 @@ proc explainError*(errorMsg, sourceCode, fileName: string): AiResponse =
return res return res
proc generateCode*(description: string): AiResponse = proc generateCode*(description: string): AiResponse =
## High-level helper: generate Clojure code from description ## High-level helper: generate Bara Lang code from description
let config = detectConfig() let config = detectConfig()
let prompt = buildGenerationPrompt(description) let prompt = buildGenerationPrompt(description)
return callAiApi(config, prompt) return callAiApi(config, prompt)
proc optimizeCode*(code: string): AiResponse = proc optimizeCode*(code: string): AiResponse =
## High-level helper: suggest optimizations for Clojure code ## High-level helper: suggest optimizations for Bara Lang code
let config = detectConfig() let config = detectConfig()
let prompt = buildOptimizationPrompt(code) let prompt = buildOptimizationPrompt(code)
return callAiApi(config, prompt) return callAiApi(config, prompt)
proc debugCode*(code: string, evalResult: string): AiResponse = proc debugCode*(code: string, evalResult: string): AiResponse =
## High-level helper: debug a Clojure expression and its result ## High-level helper: debug a Bara Lang expression and its result
let config = detectConfig() let config = detectConfig()
let prompt = buildDebugPrompt(code, evalResult) let prompt = buildDebugPrompt(code, evalResult)
return callAiApi(config, prompt) return callAiApi(config, prompt)
+3 -3
View File
@@ -1,4 +1,4 @@
# Clojure/Nim — AI-First Clojure Compiler # Bara Lang — AI-First Compiler
import os, osproc, strutils, times import os, osproc, strutils, times
import reader, emitter, types, repl, macros, deps, ai_assist, tui import reader, emitter, types, repl, macros, deps, ai_assist, tui
@@ -213,7 +213,7 @@ proc main() =
let args = commandLineParams() let args = commandLineParams()
if args.len == 0: if args.len == 0:
echo "Clojure/Nim — AI-First Clojure Compiler" echo "Bara Lang — AI-First Compiler"
echo "" echo ""
echo "Usage:" echo "Usage:"
echo " cljnim compile <file.clj> [output.nim] Compile to Nim source" echo " cljnim compile <file.clj> [output.nim] Compile to Nim source"
@@ -222,7 +222,7 @@ proc main() =
echo " cljnim repl [--json] Start REPL (human or AI mode)" echo " cljnim repl [--json] Start REPL (human or AI mode)"
echo " cljnim deps Resolve dependencies from deps.edn" echo " cljnim deps Resolve dependencies from deps.edn"
echo " cljnim -e '<code>' Evaluate expression" echo " cljnim -e '<code>' Evaluate expression"
echo " cljnim ai '<description>' Generate Clojure code with AI" echo " cljnim ai '<description>' Generate Bara Lang code with AI"
echo " cljnim tui Start interactive TUI" echo " cljnim tui Start interactive TUI"
echo "" echo ""
echo "REPL Commands:" echo "REPL Commands:"
+2 -2
View File
@@ -1,4 +1,4 @@
# Clojure → Nim Emitter # Bara Lang → Nim Emitter
import strutils, sets, algorithm import strutils, sets, algorithm
import types import types
import macros import macros
@@ -2059,7 +2059,7 @@ proc emitProgramInternal(forms: seq[CljVal]): string =
pushScope() pushScope()
requiredImports = initHashSet[string]() requiredImports = initHashSet[string]()
var headerLines: seq[string] = @[ var headerLines: seq[string] = @[
"# Generated by Clojure/Nim", "# Generated by Bara Lang",
"import cljnim_runtime", "import cljnim_runtime",
] ]
+1 -1
View File
@@ -1,4 +1,4 @@
# Clojure Reader (EDN subset) # Bara Lang Reader (EDN subset)
import strutils import strutils
import types import types
+4 -4
View File
@@ -1,4 +1,4 @@
# AI-First REPL for Clojure/Nim # AI-First REPL for Bara Lang
import os, osproc, strutils, json, times, net import os, osproc, strutils, json, times, net
import reader, emitter, types, macros, eval, ai_assist import reader, emitter, types, macros, eval, ai_assist
@@ -82,7 +82,7 @@ proc buildProgram(state: ReplState, form: CljVal, isDef: bool): string =
allForms.add(form) allForms.add(form)
var header = @[ var header = @[
"# Generated by Clojure/Nim REPL", "# Generated by Bara Lang REPL",
"import cljnim_runtime", "import cljnim_runtime",
"", "",
] ]
@@ -252,7 +252,7 @@ proc evalForm*(state: var ReplState, formStr: string): JsonNode =
} }
proc runHumanRepl*(state: var ReplState) = proc runHumanRepl*(state: var ReplState) =
echo "Clojure/Nim REPL" echo "Bara Lang REPL"
echo "Type :quit to exit, :help for commands" echo "Type :quit to exit, :help for commands"
echo "" echo ""
@@ -275,7 +275,7 @@ proc runHumanRepl*(state: var ReplState) =
echo ":defs List defined vars" echo ":defs List defined vars"
echo ":clear Clear all definitions" echo ":clear Clear all definitions"
echo ":ns Show current namespace" echo ":ns Show current namespace"
echo ":ai <desc> Ask AI to generate Clojure code" echo ":ai <desc> Ask AI to generate Bara Lang code"
echo ":optimize <code> Ask AI to suggest optimizations" echo ":optimize <code> Ask AI to suggest optimizations"
echo ":debug <expr> Ask AI to debug an expression" echo ":debug <expr> Ask AI to debug an expression"
of ":defs": of ":defs":
+2 -2
View File
@@ -1,4 +1,4 @@
# Clojure/Nim TUI — Terminal User Interface # Bara Lang TUI — Terminal User Interface
# Fullscreen menu-driven interface for cljnim # Fullscreen menu-driven interface for cljnim
import std/os import std/os
@@ -72,7 +72,7 @@ proc runTui*() =
illwillDeinit() illwillDeinit()
showCursor() showCursor()
echo "" echo ""
echo "=== Starting Clojure/Nim REPL ===" echo "=== Starting Bara Lang REPL ==="
echo "Type :quit to return to TUI" echo "Type :quit to return to TUI"
echo "" echo ""
var replState = initReplState(rmHuman) var replState = initReplState(rmHuman)
+3 -3
View File
@@ -127,7 +127,7 @@ proc drawMainMenu*(tb: var TerminalBuffer, state: var ScreenState) =
let h = terminalHeight() let h = terminalHeight()
# Header # Header
let title = "Clojure/Nim TUI" let title = "Bara Lang TUI"
tb.write(centerX(title, w), 1, fgCyan, title) tb.write(centerX(title, w), 1, fgCyan, title)
tb.drawHorizLine(0, w - 1, 2, doubleStyle = true) tb.drawHorizLine(0, w - 1, 2, doubleStyle = true)
@@ -436,7 +436,7 @@ proc drawRun*(tb: var TerminalBuffer, state: var ScreenState) =
let w = terminalWidth() let w = terminalWidth()
let h = terminalHeight() let h = terminalHeight()
tb.write(centerX("Run Clojure File", w), 1, fgCyan, "Run Clojure File") tb.write(centerX("Run Bara Lang File", w), 1, fgCyan, "Run Bara Lang File")
tb.drawHorizLine(0, w - 1, 2, doubleStyle = true) tb.drawHorizLine(0, w - 1, 2, doubleStyle = true)
let valX = 12 let valX = 12
@@ -646,7 +646,7 @@ proc drawHelp*(tb: var TerminalBuffer, state: var ScreenState) =
tb.drawHorizLine(0, w - 1, 2, doubleStyle = true) tb.drawHorizLine(0, w - 1, 2, doubleStyle = true)
let helpText = @[ let helpText = @[
"Clojure/Nim TUI v0.1.0", "Bara Lang TUI v0.1.0",
"", "",
"Navigation:", "Navigation:",
" Arrow Keys / Tab Navigate menus and fields", " Arrow Keys / Tab Navigate menus and fields",
+1 -1
View File
@@ -1,4 +1,4 @@
# Clojure Value Types (Compiler internal representation) # Bara Lang Value Types (Compiler internal representation)
import sequtils, strutils import sequtils, strutils
type type