Clojure - efeitos colaterais acontecendo fora de ordem
Enquanto brincava com o Clojure, escrevi um programa muito básico para ecoar o que o usuário digitar nele. No entanto, não funciona de uma maneira que eu percebo natural. Aqui está o código:
(defn goo []
(print "echo> ")
(def resp (read-line))
(print resp)
)
Eu esperaria que o código funcionasse assim (para mim, digitandofoo
como entrada pararead-line
):
user=> (goo)
echo> foo
foonil
Mas, em vez disso, o eco e a linha de leitura são alterados:
user=> (goo)
foo
echo> foonil
Por que isso acontece? Falta uma sutileza?
EDIT: Da resposta de Joe, a solução correta atualizada é:
(defn goo []
(print "echo> ")
(flush)
(def resp (read-line))
(print resp)
(flush)
)
Além disso, os flushes não são necessários se você usarprintln
ao invés deprint
.