Clojure - побочные эффекты, выходящие из строя

Работая с Clojure, я написал очень простую программу, которая отображает все, что пользователь вводит в нее. Тем не менее, это не работает таким образом, что я воспринимаю как естественный. Вот код:

(defn goo []
  (print "echo> ")
  (def resp (read-line))
  (print resp)
)

Я ожидаю, что код будет работать так (для меня набравfoo в качестве входа дляread-line):

user=> (goo)
echo> foo
foonil

Но вместо этого переключаются эхо и строка чтения:

user=> (goo)
foo
echo> foonil

Почему это происходит? Есть ли тонкость, которую мне не хватает?

РЕДАКТИРОВАТЬ: Из ответа Джо, обновленное правильное решение:

(defn goo []
  (print "echo> ")
  (flush)
  (def resp (read-line))
  (print resp)
  (flush)
)

Кроме того, сброс не требуется, если вы используетеprintln вместоprint.

Ответы на вопрос(2)

Ваш ответ на вопрос