(read-line) выполняется перед предыдущим prinln - PullRequest
1 голос
/ 10 апреля 2019
(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)

и запустите его, не через repl он работает как положено, за исключением того, что все запускается дважды!

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

Что происходит!

Это все с использованием lein

1 Ответ

2 голосов
/ 10 апреля 2019

Я собираюсь выйти здесь на конечность, потому что скоро начну работать.

Вы запускаете это через REPL в IntelliJ + Cursive? Если да, то одна из конфигураций REPL (та, которая вызывает всплывающее окно для ввода ввода) не очень подходит для ввода ввода в stdin. Я не уверен почему, но я имел дело с этим некоторое время. В «Редактировать конфигурации ...» можно выбрать два параметра конфигурации: «nREPL» (который я называю «Full») и «clojure.main» (который я называю «Simple»).

Если я что-то делаю с stdin, я использую Simple, потому что у Full странное поведение, которое вы описываете. Simple также загружается быстрее с самого начала, но не допускает таких приятных вещей, как уничтожение текущей выполняемой задачи без уничтожения всего REPL.

Чтобы «исправить» это, щелкните раскрывающийся список конфигурации запуска в правом верхнем углу, нажмите «Изменить конфигурации», «+» в верхнем левом углу, «Clojure REPL», «Локальный», затем используйте «clojure.main». msgstr "опция" Какой тип REPL запустить: ". Дайте ему имя типа «Простой» или что-то, чтобы отличить его от другой конфигурации, которую вы используете.


И, как упоминал @akond, вы запускаете приложение дважды, если используете lein run или аналогичный механизм, который вызывает для вас -main. В любом случае наличие в скрипте вызова верхнего уровня -main не является идеальным. Это заставит весь скрипт запускаться каждый раз, когда вы загружаете файл, что, если вы разрабатываете с REPL, может происходить довольно часто. Лучше всего просто вызвать -main в REPL, когда вы явно хотите, чтобы он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...