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



我想以Clojure REPL的形式提供一个应用程序。Ie.用户从终端运行的东西,它有一个完整的Clojure REPL,其中包含一些作为Clojure函数的额外功能。

我希望整个过程都生活在一个独立的JAR中,而不是依赖于已经安装了Clojure的用户,或者知道如何安装Clojure或导入额外的库。跑步时,整个东西都应该在那里。

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

您所要做的就是在自己的main中运行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,因此您可以从那里运行不同的main:s。

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

  • REST-REPL:添加有状态URL导航和使用JSON/XML API的工具
  • WREPL:使用被积函数为REPL生成基于模块的组合

最新更新