[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)