2015-10-03 2 views
1

Рассмотрим очень простое определение функции в Clojure:Как создать простой userprompt в Clojure

(defn prompt [] 
    (print ">>> ") 
    (read-line)) 

Моя цель, чтобы позволить пользователю ввести строку вставляться перед посредством безотлагательного-приставкой. Тем не менее, кажется, что read-line исполняется перед оператором print. Однако путем промывки выходного потока

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

Эта функция работает по назначению. Почему мне вручную нужно сбросить из для того, чтобы «>>>» было выписано? Согласно документам, функции и do должны выполнять выражения в порядке.

+0

Это обычная ситуация для буферизованного вывода для любого языка. Даже C++ имеет функцию флеша. Буферизованный выход предназначен для повышения производительности за счет потери синхронизации между потоком и выходом программы. Поэтому, если вы хотите быть уверенным, что вывод печатается, вам нужно свернуть. – JustAnotherCurious

ответ

2

Выполнены под заказ. Но выполнение print не означает, что данный вывод будет сброшен в любой поток, на который указывает переменная *out*. Как говорят документы, то функция print

Печать объект (ы) в выходной поток, который является текущим значением из * из *.

И по умолчанию * из * указывает на PrintWriter, что, как правило, цель System.out. При использовании экземпляров PrintWriter сброс по умолчанию не включен. Хотя вы можете включить автозагрузку, используя certain constructors для создания экземпляра.

Даже тогда, с PrintWriter случаях:

если автоматическая промывка включена, это будет сделано только тогда, когда один из Println, Printf или методы форматирования вызывается, а не всякий раз, когда символ новой строки случается быть выведенным.

1

Вы можете использовать println вместо print, чтобы получить то, что вы имеете в виду:

(defn prompt [] 
    (println ">>> ") 
    (read-line)) 

Разница заключается в использовании pr в (source print) и в (source println)prn используется. Взгляните на исходные коды.

Смежные вопросы