Repository navigation
QLISP v2.7.5 — O(1) spine-append для setq-накопителей
QLISP 2.7.5 — Release Notes
Тег: v2.7.5 · Платформы: Linux x86_64, Windows x86_64
Бинарники — сборка CI (Linux: GCC/Ninja/OpenBLAS/OpenMP; Windows: MSYS2 MinGW64), коммит d431c57 ветки main компиляторного репозитория (CI run 36707065329, зелёный). Состав: qlisp (REPL/интерпретатор + JIT), qlisp-lsp, qvalent.
| Файл | Платформа | Состав |
|---|---|---|
qlisp-linux-x86_64 |
Linux x86_64 | REPL/интерпретатор + JIT |
qlisp-lsp-linux-x86_64 |
Linux x86_64 | Language Server |
qvalent-linux-x86_64 |
Linux x86_64 | пакетный менеджер |
qlisp-windows-x86_64.zip |
Windows x86_64 | qlisp.exe, qlisp-lsp.exe, qvalent.exe |
SHA256SUMS — контрольные суммы всех файлов. Рантайм без LLVM: ldd qlisp — только OpenBLAS/GOMP/libstdc++.
Что нового — O(1) spine-append для setq-накопителей (FIXED)
Тестер: (setq acc (cons x acc)) в цикле давал квадратичные время и память (глобальный аккумулятор n=2000 → 210 МБ, n=12000 → 6.6 ГБ).
- O(1) spine-append: новый элемент re-home'ится, хвост переиспользуется по указателю (
prim_consне клонирует — инвариант точен). Захваченные кадры (defun) покрывает то же условие: fast-pathsetqтеперь работает и по captured-биндингам. rehome_loop_bindingпереведён на append + suffix-скан(setq a (cdr a))(освобождает ровно пропущенный префикс); записи сканируются base-скоупед — вложенныйwhileсо своимsetqпушит свою запись (тень), не затирая внешнюю.finish_loop_bindingsбольше не промоутит запомненное значение записи (терял элементы) — промоутится текущее значение биндинга, цепочка освобождается cdr-спин-волком.do_whileне клонирует re-homed значение в ping-pong скоупы; результат клонируется в root один раз перед finish.clone_toдля CONS — итеративен по cdr-спайну (car-деревья рекурсивно): длинный аккумулятор не сжигает стек.
Production-check (RSS): глобальный n=2000: 210 МБ → 0 МБ дельты; n=12000: 6.6 ГБ → 1.8 МБ (линейно). Локальный n=8000: 2.1 с → 0.14 с. Корпус 68/68; tests/setq_spine.qlsp 16/16 за 0.8 с; ASan чисто.