From 595d4d3ead3b5670398648d645f86eeabd18aa3e Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 24 Aug 2021 09:40:12 +0200 Subject: [PATCH] [#15] Add println --- deps.edn | 2 +- resources/public/html/local.html | 25 +++++++++++++++++++++++ src/scittle/core.cljs | 21 ++++++++++++------- src/scittle/impl/common.cljs | 4 ++++ src/scittle/impl/io.cljs | 35 ++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 resources/public/html/local.html create mode 100644 src/scittle/impl/common.cljs create mode 100644 src/scittle/impl/io.cljs diff --git a/deps.edn b/deps.edn index 15f95f8..c3a167a 100644 --- a/deps.edn +++ b/deps.edn @@ -3,7 +3,7 @@ :deps {org.clojure/clojure {:mvn/version "1.10.3"} borkdude/sci {:git/url "https://github.com/borkdude/sci" - :sha "e80a2093722c510ef7988ed4e3b0d9f19f821b52"} + :sha "1ae916d4ab972b0a38da3a18665c5fb176401ebc"} reagent/reagent {:mvn/version "1.0.0"} cljsjs/react {:mvn/version "17.0.2-0"} cljsjs/react-dom {:mvn/version "17.0.2-0"} diff --git a/resources/public/html/local.html b/resources/public/html/local.html new file mode 100644 index 0000000..868d48c --- /dev/null +++ b/resources/public/html/local.html @@ -0,0 +1,25 @@ + + + + + + + + + +
+ + diff --git a/src/scittle/core.cljs b/src/scittle/core.cljs index db86965..84520b8 100644 --- a/src/scittle/core.cljs +++ b/src/scittle/core.cljs @@ -1,10 +1,12 @@ (ns scittle.core (:refer-clojure :exclude [time]) - (:require [goog.object :as gobject] + (:require [cljs.reader :refer [read-string]] + [goog.object :as gobject] [goog.string] [sci.core :as sci] + [scittle.impl.common :refer [cljns]] [scittle.impl.error :as error] - [cljs.reader :refer [read-string]])) + [scittle.impl.io :as io])) (clojure.core/defmacro time "Evaluates expr and prints the time it took. Returns the value of expr." @@ -17,15 +19,20 @@ ret#)) (def stns (sci/create-ns 'sci.script-tag nil)) -(def cljns (sci/create-ns 'clojure.core nil)) (def rns (sci/create-ns 'cljs.reader nil)) +'clojure.core {} + (def namespaces {'clojure.core - {'println println - 'prn prn - 'system-time system-time - 'time (sci/copy-var time cljns) + {'*print-fn* io/print-fn + '*print-newline* io/print-newline + ;; 'with-out-str (sci/copy-var io/with-out-str cljns) + 'prn (sci/copy-var io/prn cljns) + 'print (sci/copy-var io/print cljns) + 'println (sci/copy-var io/println cljns) + 'time (sci/copy-var time cljns) + 'system-time (sci/copy-var system-time cljns) 'random-uuid random-uuid 'read-string (sci/copy-var read-string rns)} 'goog.object {'set gobject/set diff --git a/src/scittle/impl/common.cljs b/src/scittle/impl/common.cljs new file mode 100644 index 0000000..a3bbd7e --- /dev/null +++ b/src/scittle/impl/common.cljs @@ -0,0 +1,4 @@ +(ns scittle.impl.common + (:require [sci.core :as sci])) + +(def cljns (sci/create-ns 'clojure.core nil)) diff --git a/src/scittle/impl/io.cljs b/src/scittle/impl/io.cljs new file mode 100644 index 0000000..52065f8 --- /dev/null +++ b/src/scittle/impl/io.cljs @@ -0,0 +1,35 @@ +(ns scittle.impl.io + (:refer-clojure :exclude [prn print println with-out-str]) + (:require + [cljs.core :as c] + [goog.string] + [sci.core :as sci] + [scittle.impl.common :refer [cljns]])) + +(def print-fn (sci/copy-var *print-fn* cljns)) +(def print-newline (sci/copy-var *print-newline* cljns)) + +(defn println [& objs] + (binding [*print-fn* @print-fn + *print-newline* @print-newline] + (apply c/println objs))) + +(defn prn [& objs] + (binding [*print-fn* @print-fn + *print-newline* @print-newline] + (apply c/prn objs))) + +(defn print [& objs] + (binding [*print-fn* @print-fn] + (apply c/print objs))) + +(defn ^:macro with-out-str + "Evaluates exprs in a context in which *print-fn* is bound to .append + on a fresh StringBuffer. Returns the string created by any nested + printing calls." + [_ _ & body] + `(let [sb# (goog.string/StringBuffer.)] + (binding [cljs.core/*print-newline* true + cljs.core/*print-fn* (fn [x#] (.append sb# x#))] + ~@body) + (cljs.core/str sb#)))