While dabbling in Clojure I've written a very basic program to echo whatever the user types into it. However, it doesn't run in a way that I'm perceiving to be natural. Here's the code:
(defn goo []
(print "echo> ")
(def resp (read-line))
(print resp)
)
I would expect the code to run like this (for me typing in foo
as the input to read-line
):
user=> (goo)
echo> foo
foonil
But instead, the echo and read-line is switched:
user=> (goo)
foo
echo> foonil
Why does this happen? Is there a subtlety I'm missing?
EDIT: From Joe's answer, the updated correct solution is:
(defn goo []
(print "echo> ")
(flush)
(def resp (read-line))
(print resp)
(flush)
)
Also, the flushes aren't necessary if you use println
instead of print
.
I know nothing of clojure but this sounds like a case of buffers not getting flushed. Figure out how to flush standard out after the print. The println function probably flushes at the end of each line. Try:
(defn goo []
(print "echo> ")
(flush )
(def resp (read-line))
(print resp)
)
Also, please don't use "def" unless you really, really want to define a global variable. Use "let" instead:
(defn goo []
(print "echo> ")
(flush)
(let [resp (read-line)]
(print resp)
(flush)))
or, shorter
(defn goo []
(print "echo> ")
(flush)
(print (read-line))
(flush))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With