61ac06ab5f
Introduce fat function pointers (BuxFn {code, env}) so capturing closures
are heap-allocated per value in both bootstrap and selfhost. Expand
Array/Map/Set/String/Test/Result APIs, add proper tuple codegen and
error snippets with multi-char underlines, golden diagnostic tests, and
LSP diagnostics via buxc check.
8.0 KiB
8.0 KiB
Bux — План към „добър“ език (v0.5 → v1.0)
Дата: 2026-07-15
Текущо: v0.5.0 — selfhost loop, gradual ownership, green threads, 26+ examples ✅
Цел: Език, с който се пишат реални проекти комфортно, безопасно (по избор) и с надежден toolchain.
Диагноза (къде сме)
| Слой | Състояние | Оценка |
|---|---|---|
| Frontend (lex/parse) | Пълен Pratt parser, recovery | ★★★★☆ |
| Sema / generics | Monomorphization, trait bounds basic | ★★★★☆ |
| HIR → C | Работи; tuples/func-ptr half-baked в bootstrap | ★★★☆☆ |
Selfhost (src/) |
~12k LOC, binary-identical loop | ★★★★★ |
| Gradual ownership | @[Checked], &/&mut, move, Drop |
★★★☆☆ (basic) |
| Concurrency | M:N tasks + channels + async | ★★★★☆ |
| Stdlib | 25+ модула, но колекциите са минимални | ★★★☆☆ |
| Tooling | new/build/run/test/fmt, LSP prototype, VSCode |
★★☆☆☆ |
| Ecosystem / registry | path+git deps; няма централен registry | ★☆☆☆☆ |
| Документация | Има, но drift (PLAN vs README версии) | ★★★☆☆ |
Силна ниша: gradual ownership (C-скорост на писане + opt-in Rust-safety).
Слабо място: ergonomics на stdlib + maturity на tooling + пълнота на borrow checker.
Какво значи „добър“ за Bux
- Ежедневен DX — колекции, string, assert, грешки, които разбираш за секунди.
- Предвидима безопасност —
@[Checked]да хваща 80% от UAF/double-borrow без lifetime hell. - Selfhost като dogfood — компилаторът и apps (
nexus,boko) са proof. - Инструменти — fmt, test, LSP, package install без ръчна магия.
- Стабилна спецификация — LanguageRef = реалното поведение.
Не целим „по-добър Rust“. Целим единствения език с gradual safety + Go-стил concurrency без GC.
Фази
A — Ergonomics & Stdlib (P0, сега) 🔄
| # | Задача | Защо | Статус |
|---|---|---|---|
| A.1 | Array: Pop, Clear, IsEmpty, First, Last, Cap, Reserve | Без това колекциите са неудобни | ✅ (тази сесия) |
| A.2 | String: IsEmpty, ReplaceAll | Чести операции; само first-replace досега | ✅ (тази сесия) |
| A.3 | Os_Exit + Test_AssertEqString / richer asserts | Тестове и CLI без raw bux_exit |
✅ (тази сесия) |
| A.4 | Map_Remove / Set polish | Completeness на колекциите | ✅ (тази сесия) |
| A.5 | Iter: map/filter/fold върху closures | Higher-order без boilerplate | ⏳ |
| A.6 | Result helpers: Expect, UnwrapErr, Or | По-малко match boilerplate | ✅ (тази сесия) |
B — Compiler Correctness (P0)
| # | Задача | Защо | Статус |
|---|---|---|---|
| B.1 | Proper tuple types в C backend | (T,U) → Tuple_T_U struct + .0/.1 |
✅ |
| B.2 | Function pointer types | func(T)->U вече работи в LIR backend |
✅ |
| B.3 | Match expression до край в C (не return "0") |
Expression-context match | |
| B.4 | Closures: multi-instance + loop/return в body | Реални higher-order callbacks | |
| B.5 | По-добри diagnostics (snippet + hint) | DX #1 за нови потребители | ✅ |
| B.6 | Bootstrap ↔ selfhost feature parity | Operator overloading, string interp и в selfhost |
C — Gradual Ownership 2.0 (P1)
| # | Задача | Защо |
|---|---|---|
| C.1 | Lifetime elision за common cases | Без 'a в 90% от API-тата |
| C.2 | Exclusive &mut vs shared & data-flow |
По-малко false negatives |
| C.3 | Auto-drop edge cases (early return, branches) | RAII да е надежден |
| C.4 | @[Release] zero-cost path документация + golden tests |
Killer story: safe default, free hot path |
D — Tooling (P1)
| # | Задача | Защо |
|---|---|---|
| D.1 | LSP: hover, go-to-def, diagnostics (wire към sema) | IDE = adoption |
| D.2 | bux fmt стабилен + CI check |
Единен style |
| D.3 | bux test с --filter, exit codes, summary table |
CI-friendly |
| D.4 | bux doc от /// comments |
Самодокументиращ се stdlib |
| D.5 | Golden tests за stdlib modules | Регресии без изненади |
E — Ecosystem & v1.0 (P2)
| # | Задача | Защо |
|---|---|---|
| E.1 | Package registry protocol (git/HTTP) | bux add foo без path hacks |
| E.2 | 3–5 production-quality apps в apps/ |
Showcase |
| E.3 | Language freeze + semver policy | Trust |
| E.4 | Debugger/DWARF basics | Systems audience |
| E.5 | Benchmarks vs C/Zig/Nim (micro + nexus) | Marketing + regression |
Препоръчан ред на работа
A (stdlib ergonomics) → B (compiler holes) → C (ownership depth)
↓ ↓
D (tooling) ←────────── dogfood apps
↓
E (v1.0 ecosystem)
Правило: всяка сесия ship-ва нещо runnable (stdlib API, fix, example), не само docs.
Acceptance criteria за „добър v1.0“
- Всички examples + selfhost-loop + 3 apps минават на CI
- Array/Map/String/Test API покрива 90% от ежедневните нужди
@[Checked]хваща use-after-move + double&mutв documented subsetbux test+bux fmt+bux checkса default developer loop- LanguageRef синхронизиран с компилатора
- Поне един външен проект (не в monorepo) build-ва с git dep
Сесия 1 (stdlib ergonomics)
Array_Pop,Array_Clear,Array_IsEmpty,Array_First,Array_Last,Array_Cap,Array_ReserveString_IsEmpty,String_ReplaceAllOs_ExitTest_AssertEqString,Test_AssertNeqInt,Test_AssertEqBool- Example + docs update
Сесия 2 (collections + tuples)
Map_Remove/Map_Clear/Map_IsEmpty(+ StringMap)Set_Remove/Set_Clear/Set_IsEmptyResult_Expect/Result_UnwrapErr/Result_OrOption_Expect/Option_Or- Tuples:
(T, U)→typedef struct { T _0; U _1; } Tuple_T_U+ field access.0/.1 - Examples:
tuples,func_ptr,map_remove
Сесия 3 (diagnostics + collections)
- Rust-style errors in bootstrap CLI:
--> file:line:col, source snippet,^caret,= help:hints SourceLocation.filepropagated from lexer- Better caret for type-mismatch on
let(points at initializer) Array_Contains/Array_IndexOf/Array_ExtendIter_AnyEq/Iter_AllEq/Iter_Collect- Selfhost
Diagnostic_Hintfor common messages
Сесия 4 (diagnostics depth + LSP + strings)
- Multi-char underlines (
^^^^^^^under tokens/strings/idents) - Quoted-name highlighting for
undeclared identifier 'x' - Golden error tests (
tests/error_golden/,make test-errors) - LSP runs
buxc checkand publishes real diagnostics String_IsBlank/String_Repeat
Сесия 5 (multi-instance closures)
- Fat function pointers for all
func(...)types:BuxFn { code(env, args...), env } - Capturing closures: heap-allocate env per creation site (independent instances)
- Capture-less closures + named funcs: adapters with
env = NULL - Calls through func values:
f.code(f.env, args...) - Example
multi_closure.bux— MakeAdder(10)/MakeAdder(20) yield 11 and 21 - Selfhost parity: same fat ABI in
src/hir_lower.bux+src/c_backend.bux(makers, adapters)