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?)
(let
((name (symbol-name head)))
(match
name
("if" (compile-if em args scope tail?))
("when" (compile-when em args scope tail?))
("and" (compile-and em args scope tail?))
("or" (compile-or em args scope tail?))
("let" (compile-let em args scope tail?))
("let*" (compile-let em args scope tail?))
("begin" (compile-begin em args scope tail?))
("do" (compile-begin em args scope tail?))
("lambda" (compile-lambda em args scope))
("fn" (compile-lambda em args scope))
("define" (compile-define em args scope))
("set!" (compile-set em args scope))
("quote" (compile-quote em args))
("cond" (compile-cond em args scope tail?))
("case" (compile-case em args scope tail?))
("match" (compile-match em args scope tail?))
("->" (compile-thread em args scope tail?))
("defcomp" (compile-defcomp em args scope))
("defisland" (compile-defcomp em args scope))
("defmacro" (compile-defmacro em args scope))
("defstyle" (emit-op em 2))
("defhandler" (emit-op em 2))
("defpage" (emit-op em 2))
("defquery" (emit-op em 2))
("defaction" (emit-op em 2))
("defrelation" (emit-op em 2))
("deftype" (emit-op em 2))
("defeffect" (emit-op em 2))
("quasiquote" (compile-quasiquote em (first args) scope))
("letrec" (compile-letrec em args scope tail?))
(_ (compile-call em head args scope tail?))))))))
(cond
(= name "if")
(compile-if em args scope tail?)
(= name "when")
(compile-when em args scope tail?)
(= name "and")
(compile-and em args scope tail?)
(= name "or")
(compile-or em args scope tail?)
(= name "let")
(compile-let em args scope tail?)
(= name "let*")
(compile-let em args scope tail?)
(= name "begin")
(compile-begin em args scope tail?)
(= name "do")
(compile-begin em args scope tail?)
(= name "lambda")
(compile-lambda em args scope)
(= name "fn")
(compile-lambda em args scope)
(= name "define")
(compile-define em args scope)
(= name "set!")
(compile-set em args scope)
(= name "quote")
(compile-quote em args)
(= name "cond")
(compile-cond em args scope tail?)
(= name "case")
(compile-case em args scope tail?)
(= name "match")
(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
compile-if