[230314] Clojure Inspector 사용하기

Table of Contents

inspector에는 방법이 있다.

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)

Author: Younghwan Nam

Created: 2024-09-25 Wed 07:42

Emacs 27.2 (Org mode 9.4.4)

Validate