(do
(print "Enter name: ")
(let [name (read-line)]
(println "Hello " name)))
В результате будет предложено ввести мое имя, после чего операторы print
и println
будут выполнены следующим образом:
Enter name: Hello stuart
=> nil
Я пробовал (flush)
(do
(print "Enter name: ")
(flush)
(let [name (read-line)]
(println "Hello " name)))
Но происходит то же самое, он всегда делает (строку чтения) раньше всего!
я тоже пробовал
(doall (
(print "Enter name: ")
(flush)
(let [name (read-line)]
(println "Hello " name))))
Но опять же, это сначала запрашивает имя, прежде чем что-либо еще, а затем выдает исключение :(
Я пропустил что-то очевидное здесь?
:Примечание: Это запускается через repl.
Если я попытаюсь просто создать приложение со следующим
(defn -main
"I don't do a whole lot ... yet."
[& args]
(do
(print "Enter your name: ")
(flush)
(let [s (read-line)]
(println "You entered " s))))
(-main)
и запустите его, а не через реплику, он работает, как и ожидалось, за исключением того, что он запускает все дважды!
Enter your name: stuart
You entered stuart
Enter your name: stuart
You entered stuart
Process finished with exit code 0
Если я уберу (flush)
, он сделает что-то не по порядку, но все равно сделает это дважды!
(defn -main
"I don't do a whole lot ... yet."
[& args]
(print "Enter your name: ")
(let [s (read-line)]
(println "You entered " s)))
hfghfgh
Enter your name: You entered hfghfgh
fghfgh
Enter your name: You entered fghfgh
Process finished with exit code 0
В чем дело!
Это все с помощью лейна
@akond Так и есть, я не осознавал. Я чувствую себя немного идиотом!
Я собираюсь пойти на риск здесь, потому что я скоро приступаю к работе.
Вы запускаете это через REPL в IntelliJ + Cursive? Если да, то одна из конфигураций REPL (та, которая порождает всплывающее окно для ввода ввода) не очень хорошо работает с вводом ввода на стандартный ввод. Я не уверен, почему, но я имел дело с этим некоторое время. В разделе «Редактировать конфигурации...» можно выбрать два параметра конфигурации: «nREPL» (который я называю «Полный») и «clojure.main» (который я называю «Простым»).
Если я что-то делаю со стандартным вводом, я использую Simple, потому что у Full есть странное поведение, которое вы описываете. Простой также загружается быстрее с самого начала, но не позволяет делать такие приятные вещи, как завершение текущей запущенной задачи без уничтожения всего REPL.
Чтобы «исправить» это, щелкните раскрывающийся список конфигурации запуска в правом верхнем углу, нажмите «Редактировать конфигурации», «+» в левом верхнем углу, «Clojure REPL», «Локальный», затем используйте параметр «clojure.main» в разделе «Какой тип REPL запустить:». Дайте ему имя, например «Простой» или что-то еще, чтобы отличить его от другой конфигурации, которую вы используете.
И, как упомянул @akond, вы запускаете все дважды, если используете lein run
или аналогичный механизм, который вызывает -main
для вас. В любом случае наличие вызова -main
на верхнем уровне в сценарии не идеально. Это заставит весь скрипт запускаться каждый раз, когда вы загружаете файл, что, если вы разрабатываете с помощью REPL, может быть довольно частым. Лучше просто вызывать -main
в REPL, когда вы явно хотите, чтобы он работал.
Я работаю с IntelliJ и Cursive, да! Большое спасибо за это!
@Stuart Ха, должен любить слепые снимки в темноте. И нет проблем. Это меня тоже расстроило, когда я впервые столкнулся с этим.
Вам не нужно
(-main)
.lein
делает это в любом случае. Вот почему все распечатывается дважды.