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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user