我该如何编写Clojure REPL应用程序?

时间:2018-10-27 01:39:10

标签: clojure

我想以Clojure REPL的形式提供应用程序。就是用户从终端运行的东西,并具有完整的Clojure REPL,其中包括Clojure函数附带的一堆额外功能。

我希望整个过程都驻留在独立的JAR中,而不依赖于已经安装Clojure或不知道如何安装Clojure或导入额外库的用户。整个程序在运行时应该就在那里。

有没有简单的方法可以做到这一点?就是重用现有的Clojure REPL代码?

1 个答案:

答案 0 :(得分:4)

您要做的就是在自己的主程序中运行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:使用某种漂亮的打印机

值得一提的是,您构建的每个包含clojure.main(例如clojure-$VERSION.jar)的程序(例如uberjaring)都可以从该uberjar运行REPL,因此您可以运行不同的{{1} }:s从那里。

自我广告:如果您需要进一步的灵感,这些是我过去做过的“修改过的” REPL:

  • REST-REPL:添加有状态的URL导航和工具以使用JSON / XML API
  • WREPL:使用集成剂为REPL提供基于模块的组合