Clojure - побочные эффекты, выходящие из строя - PullRequest
13 голосов
/ 23 декабря 2008

Работая в 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 ]

17 голосов
/ 23 декабря 2008

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

(defn goo []
  (print "echo> ")
  (flush )
  (def resp (read-line))
  (print resp)
)
13 голосов
/ 20 марта 2009

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

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

или, короче

(defn goo []
  (print "echo> ")
  (flush)
  (print (read-line))
  (flush))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...