(строка чтения) выполняется перед предшествующим prinln

(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

В чем дело!

Это все с помощью лейна

Вам не нужно (-main). lein делает это в любом случае. Вот почему все распечатывается дважды.

akond 10.04.2019 11:43

@akond Так и есть, я не осознавал. Я чувствую себя немного идиотом!

Stuart 10.04.2019 11:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вы запускаете это через 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 10.04.2019 14:02

@Stuart Ха, должен любить слепые снимки в темноте. И нет проблем. Это меня тоже расстроило, когда я впервые столкнулся с этим.

Carcigenicate 10.04.2019 14:03

Другие вопросы по теме