繁体   English   中英

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

[英]How would I write an application which is a Clojure REPL?

我想以Clojure REPL的形式提供申请。 IE浏览器。 用户从终端运行的东西,并有一个完整的Clojure REPL,其中包含一系列额外的功能,包括Clojure功能。

我希望整个事情都存在于一个独立的JAR中,并且不依赖于已安装Clojure的用户或知道如何安装Clojure或导入额外的库。 运行时,整个事情应该就在那里。

是否有直接的方法来做到这一点? IE浏览器。 重用现有的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 :使用某种漂亮的打印机

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

自我宣传:如果你需要进一步的灵感,这些都是我过去做过的“修改过的”REPL:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM