[230314] Clojure Inspector 사용하기
Table of Contents
inspector에는 방법이 있다.
- built-in clojure inspector
- portal
- reveal
reveal이 가장 UI가 발달되어 있고 기능도 많다. 하지만 M1 에서 몇가지 문제가 있는 것 같다. Java FX를 사용하고 있는 것 같은데 제대로 지원하지 않는가보다.
1 clojure inspector
https://clojure.github.io/clojure/clojure.inspector-api.html
클로저 고유 기능이다. swing으로 만들어진 UI가 보인다.
함수는 inspect
, inspect-table
, inspect-tree
이렇게 3개가 있으며, 직관적인 이름을 갖고 있다.
사용법은 간단하다.
(require '[clojure.inspector :as inspector]') (inspector/inspect (repeatedly 10000 #(rand-int 101))) (inspector/inspect-tree {:star-wars {:characters {:jedi ["obiwan kenobi" "Yoda" "Master Wendoo"] :sith ["Palpatine" "Count Dukoo"]}}}) (defn mock-data-set "Generates a set of mock data for each name Arguments: names as strings, names used in keys Returns: Sequence of maps, each representing confirmed cases" [& locations] (for [location locations day (range 20)] {:day day :location location :cases (+ (Math/pow (* day (count location)) 0.8) (rand-int (count location)))})) (inspector/inspect-table (mock-data-set "England" "Scotland" "Wales" "Northern Ireland"))
코드 출처 https://practical.li/clojure/data-inspector/clojure-inspector/
2 portal
사실 inspector를 사용할 일은 처음 사용하는 API를 만났을 때, database에서 가져온 정보를 한눈에 보고 싶을 때, context hashmap을 쉽게 보고 싶을 때 등등 여러 상황이 있다.
이럴 때 좀 더 보기 편하면 좋겠다면 portal을 쓰면 좀 더 이쁜 화면에서 볼 수 있다. (기능이 얼마나 더 있는지는 모르겠다. 하지만 설정이 엄청 붙게 되는 것)
이것도 사용방법은 별거 없다.
(ns demo (:require [portal.api :as inspect])) (inspect/open) (inspect/tap) (tap> {:accounts [{:name "jen" :email "jen@jen.com"} {:name "sara" :email "sara@sara.com"}]}) (inspect/clear) (inspect/close)
이렇게 tap으로 보내면 수행된다.
https://practical.li/clojure/data-inspector/portal/#portal-ui-on-repl-startup
2.1 setting
portal 세팅을 하면서 여러가지를 배웠다.
일단 practicalli에서 clojure config를 공유했다. https://practical.li/clojure/clojure-cli/repl-reloaded/
여기 있는 코드를 추가했다.
:repl/reloaded {:extra-paths ["dev" "test"] :extra-deps {nrepl/nrepl {:mvn/version "1.0.0"} cider/cider-nrepl {:mvn/version "0.30.0"} com.bhauman/rebel-readline {:mvn/version "0.1.4"} djblue/portal {:mvn/version "0.35.1"} org.clojure/tools.namespace {:mvn/version "1.4.1"} org.clojure/tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha" :git/sha "e4fb92eef724fa39e29b39cc2b1a850567d490dd"} org.slf4j/slf4j-nop {:mvn/version "2.0.6"} com.brunobonacci/mulog {:mvn/version "0.9.0"} lambdaisland/kaocha {:mvn/version "1.77.1236"} org.clojure/test.check {:mvn/version "1.1.1"} ring/ring-mock {:mvn/version "0.4.0"} criterium/criterium {:mvn/version "0.4.6"}} :main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware,portal.nrepl/wrap-portal]" "--interactive" "-f" "rebel-readline.main/-main"]} :dev/reloaded {:extra-paths ["dev" "test"] :extra-deps {djblue/portal {:mvn/version "0.35.1"} org.clojure/tools.namespace {:mvn/version "1.4.1"} org.clojure/tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha" :git/sha "e4fb92eef724fa39e29b39cc2b1a850567d490dd"} org.slf4j/slf4j-nop {:mvn/version "2.0.6"} com.brunobonacci/mulog {:mvn/version "0.9.0"} lambdaisland/kaocha {:mvn/version "1.77.1236"} org.clojure/test.check {:mvn/version "1.1.1"} ring/ring-mock {:mvn/version "0.4.0"} criterium/criterium {:mvn/version "0.4.6"}}}
이후에 cider nrepl에서 .dir-locals.el
에 이맥스 설정을 로컬에서만 설정되도록 하여 cider-jack-in을 한다.
((clojure-mode . ((cider-clojure-cli-aliases . ":dev/reloaded"))))
만약 portal만 추가하고 싶다면
:inspect/portal-cli {:extra-deps {djblue/portal {:mvn/version "0.34.2"}}} :inspect/portal-web {:extra-deps {djblue/portal {:mvn/version "0.34.2"} org.clojure/clojurescript {:mvn/version "1.10.844"}} :main-opts ["-m" "cljs.main"]} :inspect/portal-node {:extra-deps {djblue/portal {:mvn/version "0.34.2"} org.clojure/clojurescript {:mvn/version "1.10.844"}} :main-opts ["-m" "cljs.main" "-re" "node"]} :repl/inspect {:extra-deps {cider/cider-nrepl {:mvn/version "0.28.5"} djblue/portal {:mvn/version "0.33.0"}} :main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware,portal.nrepl/wrap-portal]"]}
위처럼 alias를 추가하고 아래코드로 .dir-locals.el
을 변경하면 된다.
((clojure-mode . ((cider-clojure-cli-aliases . ":env/dev:inspect/portal-cli"))))
2.2 org.clojure/tools.namespace
org.clojure/tools.namespace.repl 은 refresh
함수를 갖고 있는데 소스코드파일과 REPL에 있는 것과 비교하여
다시 평가한다고 한다.
(require '[clojure.tools.namespace.repl :refer [refresh]]) (refresh)