feat: edamame shim for SCI eval-string pipeline

Add edamame.core + clojure.tools.reader.reader-types shim to core.janet.
init-edamame-shim! takes parse-string and read-form as args to avoid
circular module dependencies. Creates shim namespaces after SCI loads.

SCI eval-string is found and callable — next step is loading the 4
internal namespaces (interpreter, parser, analyzer, opts) whose source
files aren't loaded by the ns :require handler.
This commit is contained in:
Yogthos 2026-06-02 01:18:12 -04:00
parent 18979b0765
commit 5ba938abeb
2 changed files with 80 additions and 1 deletions

View file

@ -959,4 +959,55 @@
(when (get (core-macro-names) name)
(put v :macro true)))
ns)
(error "Wrong number of args passed to: init-core!"))))
(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)))))