Skip to content

Commit

Permalink
[#15] Add println
Browse files Browse the repository at this point in the history
  • Loading branch information
borkdude committed Aug 24, 2021
1 parent 4cb8e16 commit 595d4d3
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 8 deletions.
2 changes: 1 addition & 1 deletion deps.edn
Original file line number Diff line number Diff line change
Expand Up @@ -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"}
Expand Down
25 changes: 25 additions & 0 deletions resources/public/html/local.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<html>
<head>
<script src="../js/scittle.js" type="application/javascript"></script>
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="../js/scittle.reagent.js" type="application/javascript"></script>
<script type="application/x-scittle">
(require '[reagent.core :as r]
'[reagent.dom :as rdom])

(def state (r/atom {:clicks 0}))

(defn my-component []
[:div
[:p "Clicks: " (:clicks @state)]
[:p [:button {:on-click #(do (print :foo) (println :dude) (prn (with-out-str (prn :foo))) (swap! state update :clicks inc))}
"Click me!"]]])

(rdom/render [my-component] (.getElementById js/document "app"))
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>
21 changes: 14 additions & 7 deletions src/scittle/core.cljs
Original file line number Diff line number Diff line change
@@ -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."
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/scittle/impl/common.cljs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(ns scittle.impl.common
(:require [sci.core :as sci]))

(def cljns (sci/create-ns 'clojure.core nil))
35 changes: 35 additions & 0 deletions src/scittle/impl/io.cljs
Original file line number Diff line number Diff line change
@@ -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#)))

0 comments on commit 595d4d3

Please sign in to comment.