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.

Ответы

Ответ 1

Я ничего не знаю о clojure, но это звучит как случай, когда буферы не очищаются. Выясните, как очистить стандарт после печати. Функция println, вероятно, сбрасывается в конце каждой строки. Попробуйте:

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

Ответ 2

Кроме того, не используйте "def", если вы действительно не хотите определять глобальную переменную. Вместо этого используйте "let":

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

или, короче

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