Skip to content

QLISP v2.7.5 — O(1) spine-append для setq-накопителей

Choose a tag to compare

@FQingLars FQingLars released this 02 Oct 06:03
· 4 commits to main since this release

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-path setq теперь работает и по 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 чисто.