Как я могу получить readline/rlwrap-подобные функциональные возможности при использовании clojure.main/repl?

Как я могу получить подобную readline (или rlwrap-подобную) функциональность из моего REPL, когда я использую repl функция отclojure.main?

Основанием для этого является то, что я использую и настраиваю break функция от Радости Clojure, Первое издание. Я использую это изнутри lein repl РЕПЛ. Когда моя "точка останова" срабатывает, функция readline-подобной функции REPL Лейнингена исчезает, что отчасти неудобно. Моя мышечная память заставляет меня бить ↑, а затем быстро вводить. Прежде чем я могу остановить себя, у меня есть это в моем терминале:

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

И теперь мой REPL застрял, и мне нужно убить терминал или процесс, чтобы выйти. Я бы очень хотел, чтобы я мог либо заставить readline работать в этом REPL второго уровня, либо хотя бы предотвратить срыв этой общей проблемы с моих сеансов отладки.

3 ответа

Вы должны использовать rebel readline, новый репл для clojure, разработанный bhauman тем же парнем, который привел это figwheel.

https://github.com/bhauman/rebel-readline

Он имеет функции rlwrap, подсветку синтаксиса и многострочное редактирование кода в терминале.

Попробуйте Emacs с Cider в качестве вашего repl. Когда ты (break) вы будете вытеснены из реплик Cider в минибуфер Emacs, где продолжают действовать ваши стандартные ярлыки редактирования emacs (на которых смоделирована readline).

Я не уверен rlwrap в этом поможет утилита, потому что внутренний 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)))))

Эта функция просто запрашивает правильное выражение Clojure в бесконечном цикле, оценивает его и печатает результат. В случае неправильного ввода, он печатает ошибку и продолжает. Чтобы выйти из REPL, введите q,

Пример:

(repl)
(+ 1 2) ;; 2
fsdf8 9_fsd ;; prints a stack trace
q ;; returns nil and exit
Другие вопросы по тегам