wip [skip ci]

This commit is contained in:
Michiel Borkent 2020-10-27 11:03:06 +01:00
parent 4641454958
commit 1e57369584

View file

@ -1,5 +1,7 @@
(ns babashka.impl.uberscript (ns babashka.impl.uberscript
(:require [sci.core :as sci])) (:require [clojure.java.io :as io]
[clojure.string :as str]
[sci.core :as sci]))
(defn rewrite-ns (defn rewrite-ns
"Rewrites ns form :require clauses into symbols + :reload only." "Rewrites ns form :require clauses into symbols + :reload only."
@ -24,42 +26,47 @@
(loop [] (loop []
(let [next-form (sci/parse-next *ctx* source-reader)] (let [next-form (sci/parse-next *ctx* source-reader)]
(when-not (= ::sci/eof next-form) (when-not (= ::sci/eof next-form)
(if (and (seq? next-form) (if (seq? next-form)
(= 'ns (first next-form))) (let [form (cond (= 'ns (first next-form))
(let [ns (rewrite-ns next-form)] (rewrite-ns next-form))]
(prn :ns ns) (sci/eval-form *ctx* form))
(sci/eval-form *ctx* ns))
;; look for more ns forms ;; look for more ns forms
(recur))))))) (recur)))))))
(defn uberscript [init-expr skip-namespaces resource-fn] (defn find-source [namespace extensions resource-fn]
(let [uberscript-sources (atom ()) (let [base (str/replace namespace "." "/")]
(some (fn [ext] (some-> (str base "." ext)
resource-fn
slurp))
extensions)))
(defn uberscript [init-expr {:keys [:skip-namespaces :extensions :resource-fn
:out]
:or {extensions ["clj" "cljc"]
resource-fn io/resource
out *out*}}]
(let [uberscript-sources (atom (list init-expr))
load-fn (fn [{:keys [:namespace]}] load-fn (fn [{:keys [:namespace]}]
(when resource-fn (if (contains? skip-namespaces namespace)
(if (contains? skip-namespaces namespace) ""
"" (when-let [res (find-source namespace extensions resource-fn)]
(let [res (resource-fn namespace)] (swap! uberscript-sources conj res)
(swap! uberscript-sources conj res) res)))
res))))
ctx (sci/init {:load-fn load-fn ctx (sci/init {:load-fn load-fn
:features #{:bb :clj}})] :features #{:bb :clj}})]
;; establish a thread-local bindings to allow set! ;; establish a thread-local bindings to allow set!
(sci/with-bindings {sci/ns @sci/ns} (sci/with-bindings {sci/ns @sci/ns}
(binding [*ctx* ctx] (binding [*ctx* ctx]
(process-source init-expr)) (process-source init-expr))
(prn (count @uberscript-sources))))) (io/copy (str/join "\n" (distinct @uberscript-sources)) out))))
;;;; Scratch ;;;; Scratch
(comment #_do (comment
(require '[clojure.java.io :as io]) ;;do
(require '[clojure.string :as str])
(defn test-uberscript [] (defn test-uberscript []
(uberscript "(ns foo (:require [clojure.string] :reload))" (uberscript "(ns foo (:require [clojure.string] :reload))"
#{} {:out (io/file "/tmp/uberscript.clj")
(fn [ns] (some-> (str (str/replace ns "." "/") ".clj" ) :extensions ["bb" "clj" "cljc"]}))
(io/resource)
slurp))))
(test-uberscript)) (test-uberscript))