Как бы я написал приложение, которое представляет собой Clojure REPL? - PullRequest
0 голосов
/ 27 октября 2018

Я бы хотел сделать приложение доступным в форме Clojure REPL. То есть. что-то, что пользователь запускает из терминала и имеет полный REPL Clojure с кучей дополнительных функций, включенных в функции Clojure.

Я хочу, чтобы все это находилось в автономном JAR-файле и не зависело от того, пользователь уже установил Clojure или знает, как установить Clojure или импортировать дополнительные библиотеки. Все это должно быть просто при запуске.

Есть ли простой способ сделать это? То есть. повторно использовать существующий код REPL Clojure?

1 Ответ

0 голосов
/ 27 октября 2018

Все, что вам нужно сделать, это запустить clojure.main/repl на своей главной.

Документы объясняют точки входа, которые у вас есть:

"Generic, reusable, read-eval-print loop. By default, reads from *in*,
writes to *out*, and prints exception summaries to *err*. If you use the
default :read hook, *in* must either be an instance of
LineNumberingPushbackReader or duplicate its behavior of both supporting
.unread and collapsing CR, LF, and CRLF into a single \\newline. Options
are sequential keyword-value pairs. Available options and their defaults:
   - :init, function of no arguments, initialization hook called with
     bindings for set!-able vars in place.
     default: #()
   - :need-prompt, function of no arguments, called before each
     read-eval-print except the first, the user will be prompted if it
     returns true.
     default: (if (instance? LineNumberingPushbackReader *in*)
                #(.atLineStart *in*)
                #(identity true))
   - :prompt, function of no arguments, prompts for more input.
     default: repl-prompt
   - :flush, function of no arguments, flushes output
     default: flush
   - :read, function of two arguments, reads from *in*:
       - returns its first argument to request a fresh prompt
         - depending on need-prompt, this may cause the repl to prompt
           before reading again
       - returns its second argument to request an exit from the repl
       - else returns the next object read from the input stream
     default: repl-read
   - :eval, function of one argument, returns the evaluation of its
     argument
     default: eval
   - :print, function of one argument, prints its argument to the output
     default: prn
   - :caught, function of one argument, a throwable, called when
     read, eval, or print throws an exception or error
     default: repl-caught"

Обычные вещи здесь:

  • :init: добавьте свои собственные настройки для использования REPL. Например. use некоторые библиотеки
  • :prompt: отображать другое «состояние», чем ns
  • :print: используйте какой-нибудь симпатичный принтер

Стоит отметить, что каждая создаваемая вами программа (например, uberjaring), содержащая clojure.main (например, clojure-$VERSION.jar), может запускать REPL из этого uberjar, чтобы вы могли запускать разные main: s оттуда.

Самореклама: если вам нужно дополнительное вдохновение, это «модифицированные» репли, которые я делал в прошлом:

  • REST-REPL : добавление навигации по URL с сохранением состояния и инструментов для использования API-интерфейсов JSON / XML
  • WREPL : Используйте встроенную функцию, чтобы иметь композицию на основе модуля для REPL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...