Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions src/lectures/annotate.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,56 @@
(eval '(do
(ns lectures.sandbox)
(def placeholder-values (atom {}))
(def placeholder-outputs (atom {}))
(defmacro store-result [number & body]
`(try
(let [value# (do ~@body)]
(swap! ~'lectures.sandbox/placeholder-values assoc ~number value#)
value#)
(let [output# (new java.io.StringWriter)]
(binding [*out* output#]
(let [value# (do ~@body)]

(swap! ~'lectures.sandbox/placeholder-values assoc ~number value#)
(swap! ~'lectures.sandbox/placeholder-outputs
assoc ~number (str output#))
value#)))
(catch Throwable e#
(swap! ~'lectures.sandbox/placeholder-values assoc ~number e#)
nil)))))
(eval (read-string code)))
(let [result (eval '@lectures.sandbox/placeholder-values)]
(let [result (eval '@lectures.sandbox/placeholder-values)
outputs (eval '@lectures.sandbox/placeholder-outputs)]
(remove-ns 'lectures.sandbox)
result)))
{:values result, :outputs outputs})))

(defn- placeholder->str
[value]
(condp instance? value
Throwable (str (-> value class .getName) ": " (.getMessage value))
(pr-str value)))

(defn- prettify-output
[output]
(->> output
str/split-lines
(map (partial str "; "))
(str/join "\n")
(str ";; OUTPUT:\n")))


(defn- replace-placeholders
[code placeholders]
(str/replace code #"(?m)\{(\d+)\}$" #(-> % second Integer. placeholders placeholder->str)))
[code placeholders outputs]
(str/replace code #"(?m)\{(\d+)\}$"
(fn [[_ match]]
(let [id (Integer. match)
value-string (-> id
placeholders
placeholder->str)
output (outputs id)]
(if (not-empty output)
(str value-string "\n" (prettify-output output))
value-string)))))

(defn annotate
[code]
(let [code (assign-placeholders code)
values (eval-placeholders code)]
(replace-placeholders code values)))
{:keys [values outputs]} (eval-placeholders code)]
(replace-placeholders code values outputs)))