Используйте repl вместо println в Clojure

#clojure #read-eval-print-loop #leiningen

#clojure #цикл чтения-оценки-печати #leiningen

Вопрос:

Допустим, нам нужно оценить несколько предложений в исходном файле, например

test.clj

 @(def x 1)
@(def y 2)
@(def z 3)
 

Отображается только последняя оценка, если мы явно используем либо clj или lein repl ,

 user => (load-file "test.clj")
3 
 

Мы можем окружить каждый из них, println чтобы показать их все,

тест-с-println.clj

 (println @(def x 1))
(println @(def y 2))
(println @(def z 3))
 
 user => (load-file "test-with-println.clj")
1
2
3
nil
 

Каковы лучшие альтернативы, чтобы избежать инвазивных println s по всему исходному коду, в то же время имея возможность распечатать все предполагаемые оценки под эгидой REPL?

@Решение

tap> Благодаря ответу @Sean Corfield мы можем получить желаемые результаты следующим образом,

  • передайте каждый распечатанный подражатель tap> .

test-with-tap.clj

 (-> @(def x 1) tap>)
(-> @(def y 2) tap>)
(-> @(def z 3) tap>)
 
  • REPLs не получит ни одного из своих выходных данных, пока tap> не будет включен add-tap .
 user=> (load-file "test-with-tap.clj")
nil
user=> (add-tap @(def out (bound-fn* println)))
nil
user=> (load-file "test-with-tap.clj")
1
2
3
user=> (remove-tap out)
nil
user=> (load-file "test-with-tap.clj")
nil
 

Ответ №1:

tap> вероятно, это то, что вы ищете — » rel=»nofollow noreferrer»>https://clojuredocs.org/clojure.core/tap> — Это позволяет отправлять полные значения Clojure (а не только строки) в любую функцию, зарегистрированную в качестве прослушивателя, которая может быть чем-то вроде Portal, например — https://github.com/djblue/portal — это то, что я использую весь день, каждый день, но вы также можете использовать что-нибудьтак же просто, как println add-tap и для отображения каждого общего tap> значения.

tap> Вызовы могут оставаться в вашем коде даже в рабочей среде, поскольку их использование практически не требует затрат.

Хотя tap> возвращает логическое значение, его можно использовать (doto expr tap>) для оценки и возврата expr , но все равно отправлять значение любым прослушивателям tap. tap> это отличный инструмент для отладки.

Комментарии:

1. Огромное спасибо, Шон. То, что tap> предлагает, на удивление, даже лучше, чем я мог себе представить в самом начале.

Ответ №2:

У меня еще не было возможности поиграть tap> . Моим любимым на протяжении многих лет было spy семейство функций в библиотеке Tupelo. В частности, проверьте spyx , spyx-pretty , и дайте шпионить.

Комментарии:

1. Алан, большое спасибо за ваш ухоженный замечательный проект. Я обязательно добавлю его в инструментарий.