tags:

views:

236

answers:

2

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.

+7  A: 

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)
)
jmucchiello
That did it! Adding (flush) after the prints got it. Thanks for the quick response!
Chris Bunch
Cool. Now I have a checked answer in a language I don't know. :-) Glad I could help.
jmucchiello
+5  A: 

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))
Mark Probst