HS: string template \${x} (+2 tests)

`\$window.foo` / `\${window.foo}` couldn't resolve. Two fixes:
(a) compiler.sx: in a dot-chain base position, known globals (window,
    document, navigator, location, history, screen, localStorage,
    sessionStorage, console) emit `(host-global "name")` instead of a
    bare unbound symbol.
(b) generator: `eval-hs-locals` now also sets each binding on
    `window.<name>` via `host-set!`, so tests that translated
    `window.X = Y` as a local pair still see `window.X` at eval time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 21:52:55 +00:00
parent babef2503f
commit 108e25d418
4 changed files with 10 additions and 2 deletions

View File

@@ -53,6 +53,9 @@
;; in a fresh CEK env. Avoids `apply` (whose JIT path can loop on some forms).
(define eval-hs-locals
(fn (src bindings)
;; Also expose bindings on the `window` global so tests that reference
;; window.X (common in upstream tests) can resolve them.
(for-each (fn (b) (host-set! (host-global "window") (str (first b)) (nth b 1))) bindings)
(let ((sx (hs-to-sx (hs-compile src))))
;; Build (let ((name1 (quote val1)) ...) <wrap-body>)
(let ((let-binds (map (fn (b) (list (first b) (list (quote quote) (nth b 1)))) bindings)))