wip [skip ci]
This commit is contained in:
parent
4641454958
commit
1e57369584
1 changed files with 30 additions and 23 deletions
|
|
@ -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))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue