Transpiler: native mutable globals support, eliminate 5 bootstrap patches

transpiler.sx: ml-mutable-globals list + ml-is-mutable-global? predicate.
Symbol reads emit !_ref, set! emits _ref :=, define emits !_ref deref.
bootstrap.py: remove all mutable globals regex fixups (strict, prim-param-types).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-03 13:43:55 +00:00
parent 21ad052272
commit 1498cc2bdb
2 changed files with 36 additions and 63 deletions

View File

@@ -268,6 +268,12 @@
(define ml-dynamic-globals (list "*render-check*" "*render-fn*"))
(define ml-mutable-globals (list "*strict*" "*prim-param-types*"))
(define
ml-is-mutable-global?
(fn (name) (some (fn (g) (= g name)) ml-mutable-globals)))
(define
ml-is-dyn-global?
(fn ((name :as string)) (some (fn (g) (= g name)) ml-dynamic-globals)))
@@ -431,9 +437,12 @@
(let
((mangled (ml-mangle (symbol-name expr))))
(if
(some (fn (c) (= c mangled)) set-vars)
(str "!" mangled)
mangled))
(ml-is-mutable-global? (symbol-name expr))
(str "!" mangled "ref")
(if
(some (fn (c) (= c mangled)) set-vars)
(str "!" mangled)
mangled)))
(= (type-of expr) "keyword")
(str "(String " (ml-quote-string (keyword-name expr)) ")")
(= (type-of expr) "dict")
@@ -636,15 +645,23 @@
(ml-emit-quote (first args))
(= op "set!")
(let
((var-name (if (= (type-of (first args)) "symbol") (symbol-name (first args)) (str (first args)))))
(let
((mangled (ml-mangle var-name)))
((var-name (symbol-name (first args))))
(if
(ml-is-mutable-global? var-name)
(str
"("
mangled
" := "
(ml-mangle var-name)
"ref := "
(ml-expr-inner (nth args 1) set-vars)
"; Nil)")))
"; Nil)")
(let
((mangled (ml-mangle var-name)))
(str
"("
mangled
" := "
(ml-expr-inner (nth args 1) set-vars)
"; Nil)"))))
(= op "str")
(str
"(String (sx_str ["
@@ -1751,7 +1768,10 @@
ref-decls
body-str
"\n")))))
(str "let " ml-name " =\n " (ml-expr val-expr) "\n")))))))
(if
(ml-is-mutable-global? name)
(str "let " ml-name " =\n !" ml-name "ref\n")
(str "let " ml-name " =\n " (ml-expr val-expr) "\n"))))))))
(define
ml-translate-file
@@ -1854,4 +1874,7 @@
ref-decls
body-str
"\n")))))
(str "let rec " ml-name " =\n " (ml-expr val-expr) "\n"))))))
(if
(ml-is-mutable-global? name)
(str "let rec " ml-name " =\n !" ml-name "ref\n")
(str "let rec " ml-name " =\n " (ml-expr val-expr) "\n")))))))