Fix &rest param binding in OCaml evaluator + clean test suite: 0 failures

OCaml evaluator: has_rest_param and bind_lambda_params checked for
String "&rest" but the parser produces Symbol "&rest". Both forms now
accepted. Fixes swap! extra args (signal 10 → swap! s + 5 → 15).

test-adapter-html.sx: fix define shorthand → explicit fn form, move
defcomp/defisland to top level with (test-env) for component resolution.

2515 passed, 0 failed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 13:41:13 +00:00
parent 58a122a73a
commit 1dd7c22201
2 changed files with 34 additions and 64 deletions

View File

@@ -296,9 +296,10 @@ and strict_check_args name args =
and bind_lambda_params params args local =
(* Check for &rest in param list *)
let param_strs = sx_to_list params in
let is_rest_marker = function String "&rest" | Symbol "&rest" -> true | _ -> false in
let rec find_rest idx = function
| [] -> None
| String "&rest" :: rest_name :: _ -> Some (idx, rest_name)
| x :: rest_name :: _ when is_rest_marker x -> Some (idx, rest_name)
| _ :: tl -> find_rest (idx + 1) tl
in
match find_rest 0 param_strs with
@@ -313,7 +314,7 @@ and bind_lambda_params params args local =
and has_rest_param params =
let param_strs = sx_to_list params in
List.exists (function String "&rest" -> true | _ -> false) param_strs
List.exists (function String "&rest" | Symbol "&rest" -> true | _ -> false) param_strs
and call_lambda f args caller_env =
(let params = (lambda_params (f)) in let local = (env_merge ((lambda_closure (f))) (caller_env)) in