core: Stage 2 Task 2 tier 4b — compile ns (+ use/import/refer-clojure)
ns becomes a macro (00-syntax) expanding to (do (in-ns 'name) (require …) (use …) (import …) (refer-clojure …)) — matching Clojure, where require is a fn and ns expands to require calls. use/import/refer-clojure join the namespace ops as ctx-capturing clojure.core fns (use-impl/import-impl/ refer-clojure-impl, interned by install-stateful-fns!). Removed the ns interpreter special arm; dropped ns/use/import from host_iface special-names and loader stateful-head?. Placement matters: ns lives in the FIRST overlay tier (00-syntax), because the self-hosted analyzer build is triggered while 10-seq loads and processes jolt.analyzer's own (ns …) form — ns must exist by then. Its body resolves fn/map/reduce/cond at expansion time, by which point all of 00-syntax has loaded. The bootstrap compiler (compiler.janet) still PUNTS ns/in-ns/require/ use/import (it compiles analyzer.clj/ir.clj, whose ns forms must fall back to the interpreter that expands the macro) — only the self-hosted analyzer compiles them. use-impl fixes a latent bug: it now refers the used ns's vars into the CURRENT ns (the old special interned a ns into itself, a no-op). ns/use/import now compile + interpret as plain invokes. fallback-zero: ns off must-punt, onto must-compile. Gate green: conformance 267x3, fallback-zero 38/4, bootstrap-fixpoint stage1==2==3, self-host, staged-bootstrap, sci-bootstrap, clojure-test-suite >=4034/67, namespace, deps-loader, cli, aot, embedded-stdlib, uberscript, features 78/78, all unit + spec.
This commit is contained in:
parent
e8c19c351f
commit
8e98a16e25
6 changed files with 81 additions and 69 deletions
|
|
@ -47,6 +47,7 @@
|
|||
# compiles over an INTERNED var; the built-in dynamic vars aren't interned yet,
|
||||
# so it's exercised end-to-end in the state spec instead.)
|
||||
"(require (quote [clojure.string :as s]))" "(in-ns (quote foo.bar))"
|
||||
"(ns foo.bar (:require [clojure.string :as s]))"
|
||||
"(defprotocol P (m [x]))" "(extend-type Long P (m [x] x))"
|
||||
"(reify P (m [this] 1))" "(var map)"])
|
||||
|
||||
|
|
@ -55,7 +56,7 @@
|
|||
# (require/in-ns/protocols/binding now compile). The remaining frozen/uncompiled
|
||||
# set keeps the harness honest in the punt direction.
|
||||
(def must-punt
|
||||
["(ns foo.bar)" "(defmacro m [x] x)" "(deftype T [a])"
|
||||
["(defmacro m [x] x)" "(deftype T [a])"
|
||||
"(set! *warn-on-reflection* true)" "(letfn [(f [n] (g n)) (g [n] (f n))] (f 1))"])
|
||||
|
||||
(var fails @[])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue