Вы можете просто вызвать clojure.main/repl
из вашей программы, и он начнет слушать stdin и «отвечать на него» ;-), в этот момент repl запустится
user> (clojure.main/repl)
затем я набираю в терминале (+ 1 2 3)
user=> 6
user=>
поэтому у меня был ответ в ответе, чтобы имитировать случай, когда человек, использующий вашу программу, набирает команду start repl.
для создания удобного для пользователя опыта repl проект rebl-readline добавляет много к вызову clojure.main / repl:
(rebel-readline.core/with-line-reader
(rebel-readline.clojure.line-reader/create
(rebel-readline.clojure.service.local/create))
(clojure.main/repl
:prompt (fn []) ;; prompt is handled by line-reader
:read (rebel-readline.clojure.main/create-repl-read)))
Поскольку ваша программа состоит из двух этапов,
- чтение вещей из стандартного ввода навсегда или до тех пор, пока стандартный ввод не будет окончательно закрыт.
- когда программа не работает или стандартный ввод больше не доступен, в зависимости от того, что произойдет первым, прочитайте больше со стандартного ввода.
Вы можете захотеть (или, возможно, у вас уже есть) вещь, которая выходит из with-open
после отправки какой-либо специальной строки. как только это будет получено, полностью выйдите из line-seq
и with-open
. затем запустите repl, чтобы он мог получить дескриптор входного файла.
как только вы заставите программу получить вход в repl, ваша проблема с конвейером может быть решена с помощью команды оболочки.
cat
принимает специальный аргумент
-
(просто тире, ничего больше с пробелами по обе стороны), который говорит: "Остановитесь здесь и читайте с клавиатуры до нажатия Crtl-d"
~ » cat a-file - | cat
hello im a line from a file
hello
hello
в этом примере он читает строку из файла, передает ее команде cat (замените на вашу программу), затем читает слово hello
с клавиатуры и печатает его (так что вы видите его дважды на экран)