Move &rest params into spec, eliminate 9 of 11 bootstrap patches

evaluator.sx:
- bind-lambda-params: shared &rest detection for call-lambda + continue-with-call
- *last-error-kont* mutable global for error diagnostics

transpiler.sx:
- *last-error-kont* in ml-mutable-globals

bootstrap.py: removed 9 patches (mutable globals ×5, make-env, &rest helper,
call_lambda replacement, cwc_lambda replacement). Only 3 platform-level
patches remain: make_raise_guard_frame injection, cek_run error capture,
JIT hook dispatch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-03 14:37:38 +00:00
parent db1f7f1bfb
commit e33fbd29e7
3 changed files with 85 additions and 162 deletions

View File

@@ -418,6 +418,30 @@
(define eval-expr (fn (expr (env :as dict)) nil))
(define
bind-lambda-params
(fn
(params args local)
(let
((rest-idx (index-of params "&rest")))
(if
(and (number? rest-idx) (< rest-idx (len params)))
(let
((positional (slice params 0 rest-idx))
(rest-name (nth params (+ rest-idx 1))))
(do
(for-each-indexed
(fn
(i p)
(env-bind! local p (if (< i (len args)) (nth args i) nil)))
positional)
(env-bind!
local
rest-name
(if (> (len args) rest-idx) (slice args rest-idx) (quote ())))
true))
false))))
(define
call-lambda
(fn
@@ -425,23 +449,24 @@
(let
((params (lambda-params f))
(local (env-merge (lambda-closure f) caller-env)))
(if
(> (len args) (len params))
(error
(str
(or (lambda-name f) "lambda")
" expects "
(len params)
" args, got "
(len args)))
(do
(for-each
(fn (pair) (env-bind! local (first pair) (nth pair 1)))
(zip params args))
(for-each
(fn (p) (env-bind! local p nil))
(slice params (len args)))
(make-thunk (lambda-body f) local))))))
(when
(not (bind-lambda-params params args local))
(when
(> (len args) (len params))
(error
(str
(or (lambda-name f) "lambda")
" expects "
(len params)
" args, got "
(len args))))
(for-each
(fn (pair) (env-bind! local (first pair) (nth pair 1)))
(zip params args))
(for-each
(fn (p) (env-bind! local p nil))
(slice params (len args))))
(make-thunk (lambda-body f) local))))
(define
call-component
@@ -2691,23 +2716,24 @@
(let
((params (lambda-params f))
(local (env-merge (lambda-closure f) env)))
(if
(> (len args) (len params))
(error
(str
(or (lambda-name f) "lambda")
" expects "
(len params)
" args, got "
(len args)))
(do
(for-each
(fn (pair) (env-bind! local (first pair) (nth pair 1)))
(zip params args))
(for-each
(fn (p) (env-bind! local p nil))
(slice params (len args)))
(make-cek-state (lambda-body f) local kont))))
(when
(not (bind-lambda-params params args local))
(when
(> (len args) (len params))
(error
(str
(or (lambda-name f) "lambda")
" expects "
(len params)
" args, got "
(len args))))
(for-each
(fn (pair) (env-bind! local (first pair) (nth pair 1)))
(zip params args))
(for-each
(fn (p) (env-bind! local p nil))
(slice params (len args))))
(make-cek-state (lambda-body f) local kont))
(or (component? f) (island? f))
(let
((parsed (parse-keyword-args raw-args env))