OCaml bootstrapper Phase 2: HTML renderer, SX server, Python bridge

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 23:28:48 +00:00
parent 16fa813d6d
commit 313f7d6be1
18 changed files with 2541 additions and 191 deletions

View File

@@ -318,6 +318,7 @@
(when (and (list? node) (not (empty? node)))
(let ((head (first node)))
(cond
;; set! targets
(and (= (type-of head) "symbol")
(= (symbol-name head) "set!")
(>= (len node) 2))
@@ -327,6 +328,15 @@
(let ((mangled (ml-mangle var-name)))
(when (not (some (fn (x) (= x mangled)) result))
(append! result mangled))))
;; append! targets — need ref wrapping just like set!
(and (= (type-of head) "symbol")
(= (symbol-name head) "append!")
(>= (len node) 2)
(= (type-of (nth node 1)) "symbol"))
(let ((var-name (symbol-name (nth node 1))))
(let ((mangled (ml-mangle var-name)))
(when (not (some (fn (x) (= x mangled)) result))
(append! result mangled))))
:else
(for-each (fn (child)
(when (list? child)
@@ -543,8 +553,16 @@
;; Mutation forms
(= op "append!")
(str "(sx_append_b " (ml-expr-inner (nth args 0) set-vars)
" " (ml-expr-inner (nth args 1) set-vars) ")")
(let ((target (nth args 0))
(item-expr (ml-expr-inner (nth args 1) set-vars)))
(if (and (= (type-of target) "symbol")
(some (fn (v) (= v (ml-mangle (symbol-name target)))) set-vars))
;; Target is a ref variable — emit ref mutation
(let ((mangled (ml-mangle (symbol-name target))))
(str "(" mangled " := sx_append_b !" mangled " " item-expr "; Nil)"))
;; Not a ref — fallback (returns new list)
(str "(sx_append_b " (ml-expr-inner target set-vars)
" " item-expr ")")))
(= op "dict-set!")
(str "(sx_dict_set_b " (ml-expr-inner (nth args 0) set-vars)