Как попасть в repl из приложения командной строки Clojure? - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу CLI-приложение Clojure и хотел бы, чтобы ему была дана команда, которая перетаскивала людей в clojure.main REPL.

Кто-нибудь знает, как я могу это сделать? Мои усилия не были плодотворными.

EDIT:

Моя проблема усугубляется тем фактом, что мой CLI принимает данные по каналу. Вот пример того, что я хотел бы работать:

(ns playground.core
  (:gen-class))

(defn -main
  [& args]
  (with-open [r (io/reader *in*)]
    (doseq [line (line-seq r)]
      (println line)))
;; Drop in repl after having read the input and printed its content)

Я тогда называю это так:

cat ./somefile.txt | lein trampoline run

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Может быть, вам стоит запустить REPL без головы и сделать два отдельных шага?

Шаг 1

Запустите REPL без головы, дождитесь его запуска

$ lein repl :headless :host 0.0.0.0 :port 9000
nREPL server started on port 9000 on host 0.0.0.0 - nrepl://0.0.0.0:9000

Шаг 2

В другой оболочке отправьте команды в REPL с помощью вашей команды:

$ cat test.txt 
(def hello "Hello world!")

$ cat test.txt | lein repl :connect 0.0.0.0:9000
Connecting to nREPL at 0.0.0.0:9000
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
OpenJDK 64-Bit Server VM 1.8.0_181-8u181-b13-1ubuntu0.18.04.1-b13
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

pipetest.core=> (def hello "Hello world!")
#'pipetest.core/hello
pipetest.core=> Bye for now!

Шаг 3

Вы можете подключиться к REPL, продолжить после изменения состояния с предыдущего шага, но теперь вы можете использовать его для взаимодействия.

$ lein repl :connect 0.0.0.0:9000
Connecting to nREPL at 0.0.0.0:9000
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
OpenJDK 64-Bit Server VM 1.8.0_181-8u181-b13-1ubuntu0.18.04.1-b13
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

pipetest.core=> (str hello "!!!")
"Hello world!!!!"
0 голосов
/ 08 ноября 2018

Вы можете просто вызвать 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)))


Поскольку ваша программа состоит из двух этапов,
  1. чтение вещей из стандартного ввода навсегда или до тех пор, пока стандартный ввод не будет окончательно закрыт.
  2. когда программа не работает или стандартный ввод больше не доступен, в зависимости от того, что произойдет первым, прочитайте больше со стандартного ввода.

Вы можете захотеть (или, возможно, у вас уже есть) вещь, которая выходит из 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 с клавиатуры и печатает его (так что вы видите его дважды на экран)

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