使用clojure.main/repl时,如何获得类似readline/rlwrap的功能?

dyn*_*eed 13 clojure readline leiningen read-eval-print-loop rlwrap

当我使用repl函数时,clojure.main如何从REPL获得类似readline(或类似rlwrap)的功能

背景这是我在利用和自定义break功能,从喜的Clojure的第一版.我在lein replREPL中使用它.当我的"断点"开始时,Leiningen的REPL的类似readline的功能消失了,这有点不方便.我的肌肉记忆让我很快被击中Enter.在我能够阻止自己之前,我已经在我的终端中找到了这个:

debug=> ^[[A
CompilerException java.lang.RuntimeException: Unable to resolve symbol: in this context, compiling:(/tmp/form-init13211381000659590518.clj:1:1) 
Run Code Online (Sandbox Code Playgroud)

现在我的REPL卡住了,我必须杀死终端或进程才能离开.如果我能在这个二级REPL中使用readline,或者至少可以防止这个常见问题导致我的调试会话脱轨,我非常喜欢.

Iva*_*aev 1

我不确定该rlwrap实用程序是否会有所帮助,因为内部 REPL 由外部 REPL 保存。因此输入是由 Java 代码控制的,而不是由rlwrap工具控制的。

由于您输入了错误的值,因此导致异常。我记得,该clojure.main/repl函数可能需要一个额外的参数来处理异常。也许,您可以以某种方式处理它,只需打印一个字符串“错误的输入值”即可。查看REPL 的文档

此外,您还可以实现自己的 REPL 来进行调试。很久以前,我曾经写过一些这样的内容,这里是我得到的:

(defn repl []
  (let [input (read)]
    (if (= input 'q)
      nil
      (do
        (try
          (let [result (eval input)]
            (println result))
          (catch Exception e
            (println e)))
        (recur)))))
Run Code Online (Sandbox Code Playgroud)

该函数只是在无限循环中提示输入正确的 Clojure 表达式,对其求值并打印结果。如果输入错误,它会打印错误并继续。要离开 REPL,请输入q

例子:

(repl)
(+ 1 2) ;; 2
fsdf8 9_fsd ;; prints a stack trace
q ;; returns nil and exit
Run Code Online (Sandbox Code Playgroud)