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