feat: SCI eval-string via Jolt-native reader/evaluator

Replace SCI's internal interpreter/parser/analyzer pipeline with
Jolt-native eval-string that delegates to Jolt's reader and evaluator.
All 317 SCI source forms load, 9 namespaces populated, 46 total ns.

eval-string result: (+ 1 2 3) → 6, (def x 42) x → 42

Removed edamame/core shim — no longer needed since we bypass
the SCI internal eval pipeline entirely.
This commit is contained in:
Yogthos 2026-06-02 01:22:19 -04:00
parent 5ba938abeb
commit 6e0b95aaae
5 changed files with 114 additions and 109 deletions

View file

@ -960,54 +960,3 @@
(put v :macro true)))
ns)
(error "Wrong number of args passed to: init-core!"))))
# ============================================================
# Edamame + tools.reader shim for SCI eval-string
# ============================================================
(defn make-string-reader [s]
@{:s s :pos 0 :line 1 :col 1})
(defn shim-edamame-eof [] :edamame/eof)
(defn shim-normalize-opts [opts]
(if (= true opts)
{:all true :row-key :line :col-key :column :read-cond :allow :location? nil}
(if (nil? opts) {} opts)))
(defn init-edamame-shim!
"Create edamame.core and clojure.tools.reader.reader-types namespaces.
Takes parse-str (string→form) and read-f (string pos→[form pos]) from the host reader."
[ctx parse-str read-f]
(defn edn-parse-string [& args] (parse-str (args 0)))
(defn edn-parse-string-all [& args] @[(parse-str (args 0))])
(defn edn-parse-next [& args]
(def reader (args 0))
(def s (reader :s))
(def pos (reader :pos))
(if (>= pos (length s))
(shim-edamame-eof)
(let [[form new-pos] (read-f s pos)]
(put reader :pos new-pos)
(var lp pos)
(while (< lp new-pos)
(if (= (s lp) 10)
(do (put reader :line (+ 1 (reader :line)))
(put reader :col 1))
(put reader :col (+ 1 (reader :col))))
(++ lp))
form)))
(let [edn (ctx-find-ns ctx "edamame.core")]
(ns-intern edn "eof" shim-edamame-eof)
(ns-intern edn "normalize-opts" shim-normalize-opts)
(ns-intern edn "reader" make-string-reader)
(ns-intern edn "parse-string" edn-parse-string)
(ns-intern edn "parse-string-all" edn-parse-string-all)
(ns-intern edn "parse-next" edn-parse-next)
(ns-intern edn "continue" :edamame/continue))
(let [rt (ctx-find-ns ctx "clojure.tools.reader.reader-types")]
(ns-intern rt "indexing-push-back-reader" identity)
(ns-intern rt "string-push-back-reader" make-string-reader)
(ns-intern rt "source-logging-reader?" (fn [rdr] false))
(ns-intern rt "get-line-number" (fn [rdr] (rdr :line)))
(ns-intern rt "get-column-number" (fn [rdr] (rdr :col)))))