Clojure - Nebenwirkungen, die nicht in Ordnung sind

Während ich mich in Clojure versuche, habe ich ein sehr einfaches Programm geschrieben, um alle Eingaben des Benutzers zu wiederholen. Es läuft jedoch nicht in einer Weise, die ich als natürlich empfinde. Hier ist der Code:

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

Ich würde erwarten, dass der Code so läuft (für mich @ eintippenfoo als Eingabe fürread-line):

user=> (goo)
echo> foo
foonil

Aber stattdessen wird das Echo und die Lesezeile umgeschaltet:

user=> (goo)
foo
echo> foonil

Warum passiert das? Gibt es eine Subtilität, die ich vermisse?

EDIT: Nach Joes Antwort lautet die aktualisierte korrekte Lösung:

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

Auch die Flushes sind nicht notwendig, wenn Sie @ verwendprintln Anstatt vonprint.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage