The last two keystone forms in namespaces.cljc now load, so the entire SCI
source in the harness's load order evaluates with ZERO failures (was 420/2).
Two real bugs fixed to get there:
- with-meta crashed on non-collections: (with-meta a-fn {...}) did (keys fn) ->
'expected iterable, got function'. SCI marks core fns private this way. Now
returns functions/scalars unchanged (Jolt can't attach meta to a raw fn).
- select-keys ignored a vector key-list: (each k ks) iterated the pvec's table
instead of its elements, so (select-keys m [:a]) returned {}. Now realizes ks.
Plus: add clojure.set/join (the only missing clojure.set fn), assert 0 failures
in test-load-sci so it's a real regression guard, drop debug instrumentation.
Jolt now fully loads SCI's reader-independent implementation: every pure-Clojure
module, the entire clojure.core aggregation map, and the clojure.* namespace
wiring. conformance 218/218, features 78/78, jank 120.
112 lines
3.6 KiB
Text
112 lines
3.6 KiB
Text
(use ../src/jolt/evaluator)
|
|
(use ../src/jolt/types)
|
|
(use ../src/jolt/reader)
|
|
(use ../src/jolt/api)
|
|
|
|
(def ctx (init))
|
|
|
|
(printf "Loading SCI stubs...\n")
|
|
(defn load-stubs [ctx filepath]
|
|
(var s (slurp filepath))
|
|
(var count 0)
|
|
(while (> (length (string/trim s)) 0)
|
|
(def [form rest] (parse-next s))
|
|
(set s rest)
|
|
(++ count)
|
|
(when (not (nil? form))
|
|
(eval-form ctx @{} form)))
|
|
(printf " Loaded %d stub forms\n" count))
|
|
|
|
(load-stubs ctx "src/jolt/clojure/sci/lang_stubs.clj")
|
|
(load-stubs ctx "src/jolt/clojure/sci/io_stubs.clj")
|
|
(load-stubs ctx "src/jolt/clojure/sci/host_stubs.clj")
|
|
|
|
# namespaces.cljc copies vars out of Jolt's own clojure.string/set/walk/edn, so
|
|
# make sure those are loaded before it runs.
|
|
(each lib ["clojure.string" "clojure.set" "clojure.walk" "clojure.edn"]
|
|
(protect (eval-form ctx @{} (first (parse-next (string "(require '[" lib "])"))))))
|
|
|
|
(defn load-file [ctx path]
|
|
(var s (slurp path))
|
|
(var count 0)
|
|
(var ok 0)
|
|
(var fail 0)
|
|
(var failures @[])
|
|
(while (> (length (string/trim s)) 0)
|
|
(def [form rest] (parse-next s))
|
|
(set s rest)
|
|
(++ count)
|
|
(if (not (nil? form))
|
|
(do
|
|
(printf "eval form %d..." count)
|
|
(flush)
|
|
(if (try
|
|
(do (eval-form ctx @{} form) true)
|
|
([err fib]
|
|
(printf " FAIL: %q\n" err)
|
|
(when (os/getenv "SCI_TRACE") (debug/stacktrace fib ""))
|
|
(array/push failures {:form-number count :error (string err) :form (string form)})
|
|
false))
|
|
(do
|
|
(printf " OK\n")
|
|
(++ ok))
|
|
(++ fail)))))
|
|
{:ok ok :fail fail :total count :failures failures})
|
|
|
|
(def sci-base "vendor/sci/src/sci")
|
|
|
|
(def load-order @[
|
|
["impl/macros.cljc" nil]
|
|
["impl/protocols.cljc" nil]
|
|
["impl/types.cljc" nil]
|
|
["impl/unrestrict.cljc" nil]
|
|
["impl/vars.cljc" nil]
|
|
["lang.cljc" nil]
|
|
["impl/utils.cljc" nil]
|
|
["ctx_store.cljc" nil]
|
|
["impl/deftype.cljc" nil]
|
|
["impl/records.cljc" nil]
|
|
["impl/core_protocols.cljc" nil]
|
|
["impl/hierarchies.cljc" nil]
|
|
# pure-Clojure macro/expander modules (loadable from SCI's real source)
|
|
["impl/destructure.cljc" nil]
|
|
["impl/doseq_macro.cljc" nil]
|
|
["impl/for_macro.cljc" nil]
|
|
["impl/fns.cljc" nil]
|
|
["impl/multimethods.cljc" nil]
|
|
["impl/namespaces.cljc" nil]
|
|
["core.cljc" nil]
|
|
])
|
|
|
|
(var total-ok 0)
|
|
(var total-fail 0)
|
|
(var all-failures @[])
|
|
|
|
(each [file expected-ns] load-order
|
|
(def path (string sci-base "/" file))
|
|
(printf "\n=== Loading %s ===\n" file)
|
|
(def result (load-file ctx path))
|
|
(printf " Result: %d ok, %d fail, %d total\n" (result :ok) (result :fail) (result :total))
|
|
(+= total-ok (result :ok))
|
|
(+= total-fail (result :fail))
|
|
(each f (result :failures)
|
|
(array/push all-failures {:file file :form-number (f :form-number) :error (f :error) :form (f :form)})))
|
|
|
|
(printf "\n==============================\n")
|
|
(printf "TOTAL: %d ok, %d fail, %d total\n" total-ok total-fail (+ total-ok total-fail))
|
|
(printf "==============================\n")
|
|
|
|
(printf "\ncurrent ns: %s\n" (ctx-current-ns ctx))
|
|
(printf "sci.core exists: %q\n" (not (nil? (ctx-find-ns ctx "sci.core"))))
|
|
(printf "total namespaces: %d\n" (length (keys ((ctx :env) :namespaces))))
|
|
|
|
(when (> (length all-failures) 0)
|
|
(printf "\n=== FAILURES ===\n")
|
|
(each f all-failures
|
|
(printf "[%s:%d] %s\n" (f :file) (f :form-number) (f :error))
|
|
(printf " form: %s\n" (f :form))))
|
|
|
|
# Regression guard: every form in the loaded SCI modules must evaluate cleanly.
|
|
(assert (= 0 total-fail)
|
|
(string total-fail " SCI form(s) failed to load (see FAILURES above)"))
|
|
(print "\nAll SCI bootstrap forms loaded successfully.")
|