diff --git a/src/babashka/impl/clojure/tools/reader.clj b/src/babashka/impl/clojure/tools/reader.clj index acfd528f..7e942e67 100644 --- a/src/babashka/impl/clojure/tools/reader.clj +++ b/src/babashka/impl/clojure/tools/reader.clj @@ -1,6 +1,7 @@ (ns babashka.impl.clojure.tools.reader - (:refer-clojure :exclude [read]) + (:refer-clojure :exclude [read read-string]) (:require + [clojure.tools.reader.reader-types :as rt] [edamame.core :as e] [sci.core :as sci] [sci.ctx-store :as ctx] @@ -52,7 +53,13 @@ :readers (fn [sym] (resolve-tag sym)) :auto-resolve (fn [alias] - (@alias-map alias))) + (if (= :current alias) + (symbol (str @sci/ns)) + (or (when-let [alias-map @alias-map] + (@alias-map alias)) + (sci/eval-form (ctx/get-ctx) + (list 'get '(ns-aliases *ns*) + (list 'quote alias))))))) v (e/parse-next reader opts)] (if (identical? ::e/eof v) (if (identical? :eofthrow eof) @@ -67,11 +74,18 @@ sentinel) v)))) +(defn read-string + ([s] (read-string nil s)) + ([opts s] + (when (and s (not (identical? s ""))) + (read opts (rt/string-push-back-reader s))))) + (defn resolve-symbol [sym] (p/fully-qualify (ctx/get-ctx) sym)) (def reader-namespace {'read (sci/copy-var read rns) + 'read-string (sci/copy-var read-string rns) 'resolve-symbol (sci/copy-var resolve-symbol rns) '*default-data-reader-fn* default-data-reader-fn '*alias-map* alias-map}) diff --git a/src/babashka/impl/clojure/tools/reader_types.clj b/src/babashka/impl/clojure/tools/reader_types.clj index 4d45ee25..87c8594f 100644 --- a/src/babashka/impl/clojure/tools/reader_types.clj +++ b/src/babashka/impl/clojure/tools/reader_types.clj @@ -14,4 +14,5 @@ 'read-char (sci/copy-var rt/read-char rtns) 'unread (sci/copy-var rt/unread rtns) 'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns) - 'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)}) + 'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns) + 'string-push-back-reader (sci/copy-var rt/string-push-back-reader rtns)}) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 54445f21..1d80f4b6 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -886,6 +886,14 @@ true"))) (deftest get-watches-test (is (true? (bb nil "(map? (.getWatches (doto (atom nil) (add-watch :foo (fn [k r o n])))))")))) +(deftest tools-reader-test + (is (= :user/foo (bb nil "(require '[clojure.tools.reader :as r]) (r/read-string \"::foo\")"))) + (is (= :clojure.tools.reader/foo (bb nil "(require '[clojure.tools.reader :as r]) (r/read-string \"::r/foo\")"))) + (is (= [1 2 3] (bb nil " +(require '[clojure.tools.reader :as r]) +(binding [r/*default-data-reader-fn* (fn [sym] (fn [val] [1 2 3]))] +(r/read-string \"#dude []\"))")))) + ;;;; Scratch (comment