Description
I made the mistake of using for
instead of doseq
for running side effects multiple times in a row, which (to the best of understanding) resulted in the side-effects not happening immediately, instead they only happen when evaluating the result.
The problem is that when evaluating it with Ctrl+Enter, the println
output is shown as part of the string representation of the output, instead of how it's supposed to be:
(def inventory {:wood 2 :iron 2})
(defn show-item [type amount] (format "%s: %d" (name type) amount))
(defn simplified-draw-inventory
[separator inventory]
(for [[type amount] inventory]
(println separator
(show-item type amount))))
(comment
(def x (simplified-draw-inventory "\n--------\n" inventory))
x
x
(println "foo")
:rcf)
In each screen part, the first red square is the lazy-seq
version, and the second is running println
directly.
I can see the output terminal's behavior being something unavoidable as long as you want to show the string representation as it's being generated, but the inline output's behavior is weird to me - evaluating (println "foo")
doesn't show foo
at all, while if that happens as a side-effect of transforming the result into a string (such as with lazy-seq
), it does appear there!
(It originally happened when calling simplified-draw-inventory
directly, I bound it to x
just for the example)