Revert compile-list to cond dispatch, keep compile-match for user code

The compiler's own match dispatch caused cascading JIT failures —
when compile-list is pre-compiled, the match bytecode is embedded
in it, and any subtle issue propagates to ALL subsequent compilations.

compile-list reverts to cond (battle-tested with JIT). compile-match
remains available for user code that uses match expressions.

1166 passed, 0 failed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 19:48:22 +00:00
parent 4dde8ba684
commit 4ab8e17d9b

View File

@@ -187,39 +187,68 @@
(compile-call em head args scope tail?) (compile-call em head args scope tail?)
(let (let
((name (symbol-name head))) ((name (symbol-name head)))
(match (cond
name (= name "if")
("if" (compile-if em args scope tail?)) (compile-if em args scope tail?)
("when" (compile-when em args scope tail?)) (= name "when")
("and" (compile-and em args scope tail?)) (compile-when em args scope tail?)
("or" (compile-or em args scope tail?)) (= name "and")
("let" (compile-let em args scope tail?)) (compile-and em args scope tail?)
("let*" (compile-let em args scope tail?)) (= name "or")
("begin" (compile-begin em args scope tail?)) (compile-or em args scope tail?)
("do" (compile-begin em args scope tail?)) (= name "let")
("lambda" (compile-lambda em args scope)) (compile-let em args scope tail?)
("fn" (compile-lambda em args scope)) (= name "let*")
("define" (compile-define em args scope)) (compile-let em args scope tail?)
("set!" (compile-set em args scope)) (= name "begin")
("quote" (compile-quote em args)) (compile-begin em args scope tail?)
("cond" (compile-cond em args scope tail?)) (= name "do")
("case" (compile-case em args scope tail?)) (compile-begin em args scope tail?)
("match" (compile-match em args scope tail?)) (= name "lambda")
("->" (compile-thread em args scope tail?)) (compile-lambda em args scope)
("defcomp" (compile-defcomp em args scope)) (= name "fn")
("defisland" (compile-defcomp em args scope)) (compile-lambda em args scope)
("defmacro" (compile-defmacro em args scope)) (= name "define")
("defstyle" (emit-op em 2)) (compile-define em args scope)
("defhandler" (emit-op em 2)) (= name "set!")
("defpage" (emit-op em 2)) (compile-set em args scope)
("defquery" (emit-op em 2)) (= name "quote")
("defaction" (emit-op em 2)) (compile-quote em args)
("defrelation" (emit-op em 2)) (= name "cond")
("deftype" (emit-op em 2)) (compile-cond em args scope tail?)
("defeffect" (emit-op em 2)) (= name "case")
("quasiquote" (compile-quasiquote em (first args) scope)) (compile-case em args scope tail?)
("letrec" (compile-letrec em args scope tail?)) (= name "match")
(_ (compile-call em head args scope tail?)))))))) (compile-match em args scope tail?)
(= name "->")
(compile-thread em args scope tail?)
(= name "defcomp")
(compile-defcomp em args scope)
(= name "defisland")
(compile-defcomp em args scope)
(= name "defmacro")
(compile-defmacro em args scope)
(= name "defstyle")
(emit-op em 2)
(= name "defhandler")
(emit-op em 2)
(= name "defpage")
(emit-op em 2)
(= name "defquery")
(emit-op em 2)
(= name "defaction")
(emit-op em 2)
(= name "defrelation")
(emit-op em 2)
(= name "deftype")
(emit-op em 2)
(= name "defeffect")
(emit-op em 2)
(= name "quasiquote")
(compile-quasiquote em (first args) scope)
(= name "letrec")
(compile-letrec em args scope tail?)
:else (compile-call em head args scope tail?)))))))
(define (define
compile-if compile-if