Вы можете просто вызвать clojure.main/repl
из своей программы, и она начнет слушать стандартный ввод и «отвечать на него» ;-) в этот момент начнется repl
user> (clojure.main/repl)
затем я ввожу в терминал (+ 1 2 3)
user=> 6
user=>
поэтому у меня был repl в repl, имитирующий случай, когда человек, использующий вашу программу, вводит команду start 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
с клавиатуры и также напечатал его (так что вы видите его дважды на экране)
person
Arthur Ulfeldt
schedule
08.11.2018