Debug Conjure, Zensical install & Tui Music
After a curious question in the Conjure channel of Clojurians Slack I decided to experiment with debugging Conjure itself. The issue was the first evaluation command not finding the current namespace, although successive evaluations worked correctly.
I continue to evaluate Zensical as the next tool for Practicalli books and blogs. I found a more effective way to install and upgrade zensical that also removes the need for python specific configuration files.
Conjureλ︎
Conjure is an excellent Neovim plugin for Clojure development (and many other languages).
Set conjure#debug to true in the Neovim plugin config for clojure and restart Neovim.
Practicalli nvim-Astro5 configuration snippet
{
"AstroNvim/astrocore",
---@type AstroCoreOpts
opts = {
options = {
-- configure general options: vim.opt.<key>
opt = {
spell = true, -- sets vim.opt.spell
wrap = true, -- sets vim.opt.wrap
guifont = "Fira Code:h16", -- neovide font family & size
},
-- configure global vim variables: vim.g
g = {
-- Neovim language provides - disable language integration not required
loaded_perl_provider = 0,
loaded_ruby_provider = 0,
-- Leader key for Visual-Multi Cursors (Multiple Cursors)
VM_leader = "gm", -- Visual Multi Leader (multiple cursors - user plugin)
-- Conjure plugin overrides
-- comment pattern for eval to comment command
["conjure#eval#comment_prefix"] = ";; ",
-- Hightlight evaluated forms
["conjure#highlight#enabled"] = true,
-- show HUD REPL log at startup
["conjure#log#hud#enabled"] = false,
-- auto repl (babashka)
["conjure#client#clojure#nrepl#connection#auto_repl#enabled"] = false,
["conjure#client#clojure#nrepl#connection#auto_repl#hidden"] = true,
["conjure#client#clojure#nrepl#connection#auto_repl#cmd"] = nil,
["conjure#client#clojure#nrepl#eval#auto_require"] = false,
-- Test runner: "clojure", "clojuresCRipt", "kaocha"
["conjure#client#clojure#nrepl#test#runner"] = "kaocha",
-- Debug
-- Hightlight evaluated forms
["conjure#debug"] = true,
-- Troubleshoot: Minimise very long lines slow down:
-- ["conjure#log#treesitter"] = false
-- ["conjure#log##treesitter"] = false,
-- ["conjure#log#disable_diagnostics"] = true
},
},
mappings = {
n = {
-- normal mode key bindings
-- setting a mapping to false will disable it
-- ["<esc>"] = false,
-- whick-key sub-menu for Visual-Multi Cursors (Multiple Cursors)
["gm"] = { name = "Multiple Cursors" },
-- Toggle last open buffer
["<Leader><tab>"] = { "<cmd>b#<cr>", desc = "Previous tab" },
-- navigate buffer tabs
["]b"] = { function() require("astrocore.buffer").nav(vim.v.count1) end, desc = "Next buffer" },
["[b"] = { function() require("astrocore.buffer").nav(-vim.v.count1) end, desc = "Previous buffer" },
-- snacks file explorer
["<Leader>E"] = { "<cmd>lua Snacks.picker.explorer()<cr>", desc = "Snacks Explorer" },
-- Save prompting for file name
["<Leader>W"] = { ":write ", desc = "Save as file" },
-- Gist Creation
["<Leader>gj"] = { ":GistCreateFromFile ", desc = "Create Gist (file)" },
["<Leader>gJ"] = { "<cmd>GistsList<cr>", desc = "List Gist" },
-- Neogit Status float
["<Leader>gf"] = { "<cmd>Neogit kind=floating<cr>", desc = "Git Status (floating)" },
-- Toggle between src and test (Clojure pack | other-nvim)
["<localLeader>ts"] = { "<cmd>Other<cr>", desc = "Switch src & test" },
["<localLeader>tS"] = { "<cmd>OtherVSplit<cr>", desc = "Switch src & test (Split)" },
-- Showkeys plugin (visualise key presses in Neovim window)
["<Leader>uk"] = { "<cmd>ShowkeysToggle<cr>", desc = "Toggle Showkeys" },
},
t = {
-- terminal mode key bindings
},
v = {
-- visual mode key bindings
-- Gist Creation
["<Leader>gj"] = { ":GistCreate ", desc = "Create Gist (region)" },
},
},
},
},
A repl was started on the command line, using the alias :repl/basic from Practicalli Clojure CLI Config. This includes nrepl 1.5.2 and cider-nrepl 0.58.0 as extra dependencies.
:repl/basic alias
I also tested with nrepl 1.4 and cider-nrepl 0.58.0
:repl/classic alias
Neovim was started, using the Practicalli nvim-astro5 configuration, with clojure#debug enabled.
Space+f+f in Neovim to open the 01-basic.clj file from the Practicalli Clojure Through Code project.
,+l+s in Neovim opened the Conjure log in a split window (using a split as assuming there will be a lot of output in debug mode).
As a Clojure file has been opened, Conjure does an amount of work and starts printing debug information in the log window.
Log output on opening a Clojure file in Neovim
; Sponsored by @terjesb ❤
; --------------------------------------------------------------------------------
; localhost:33735 (connected): /home/practicalli/projects/practicalli/clojure-through-code/.nrepl-port
; debug: send
{:id "8d7cdb01-c13b-4db0-80f2-2a7d9d9eeba3" :op "describe"}
; debug: send
{:id "2f5b391f-a0ca-458b-a351-cc742622f6bb" :op "ls-sessions"}
; debug: /home/practicalli/.local/share/nvim-astro5/lazy/conjure/res/client/clojure/preamble.cljc resource not cached - reading
nil
; debug: send
{:code
"(create-ns 'conjure.internal)
(intern 'conjure.internal 'initial-ns (symbol (str *ns*)))
(ns conjure.internal
(:require [clojure.pprint :as pp]
[clojure.test]
[clojure.data]
[clojure.string]))
;; This is a shim that inserts a pprint fn in the place that CIDER would create it if it's not found.
;; We shim instead of creating our own distinct function because babashka requires us
;; to refer to `cider.nrepl.pprint/pprint` if we want to use pretty printing.
;; https://github.com/Olical/conjure/issues/406
(when-not (find-ns 'cider.nrepl.pprint)
(create-ns 'cider.nrepl.pprint)
(intern 'cider.nrepl.pprint 'pprint
(fn pprint [val w opts]
(apply pp/write val
(mapcat identity (assoc opts :stream w))))))
(defn bounded-conj [queue x limit]
(->> x (conj queue) (take limit)))
(def tap-queue-size 16)
(defonce tap-queue! (atom (list)))
;; Must be a defonce so that we always have the same function
;; reference to remove-tap and add-tap. If we make a new
;; function each time we'll end up adding more and more tap
;; functions.
(defonce enqueue-tap!
(fn [x] (swap! tap-queue! bounded-conj x tap-queue-size)))
;; No setup for older Clojure versions.
(when (resolve 'add-tap)
(remove-tap enqueue-tap!)
(add-tap enqueue-tap!))
(defn dump-tap-queue! []
(reverse (first (reset-vals! tap-queue! (list)))))
(when true
(defmethod clojure.test/report :fail [m]
(clojure.test/with-test-out
(clojure.test/inc-report-counter :fail)
(println \"\\nFAIL in\" (clojure.test/testing-vars-str m))
(when (seq clojure.test/*testing-contexts*) (println (clojure.test/testing-contexts-str)))
(when-let [message (:message m)] (println message))
(print \"expected:\" (with-out-str (prn (:expected m))))
(print \" actual:\" (with-out-str (prn (:actual m))))
(when (and (seq? (:actual m))
(= #'clojure.core/not (resolve (first (:actual m))))
(seq? (second (:actual m)))
(= #'clojure.core/= (resolve (first (second (:actual m)))))
(= 3 (count (second (:actual m)))))
(let [[missing extra _] (clojure.data/diff (second (second (:actual m))) (last (second (:actual m))))
missing-str (with-out-str (pp/pprint missing))
missing-lines (clojure.string/split-lines missing-str)
extra-str (with-out-str (pp/pprint extra))
extra-lines (clojure.string/split-lines extra-str)]
(when (some? missing) (doseq [m missing-lines] (println \"- \" m)))
(when (some? extra) (doseq [e extra-lines] (println \"+ \" e))))))))
(in-ns initial-ns)
"
:id
"04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:op
"eval"}
; debug: receive
{:id "2f5b391f-a0ca-458b-a351-cc742622f6bb"
:session "6b5dbb73-26d9-454d-86fb-c3e437d6cc7c"
:sessions ["44c3284a-41df-4f7e-a66d-bb30f484db91"]
:status ["done"]}
; debug: with-sessions id for enrichment
"44c3284a-41df-4f7e-a66d-bb30f484db91"
; debug: send
{:code "#?(:clj 'clj :cljs 'cljs :cljr 'cljr :default 'unknown)"
:id "a7a02df5-c289-47b6-bba7-3c9014cdf523"
:op "eval"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"}
; debug: receive
{:aux
{:cider-version
{:incremental 0 :major 0 :minor 58 :qualifier {} :version-string "0.58.0"}
:current-ns
"user"}
:id
"8d7cdb01-c13b-4db0-80f2-2a7d9d9eeba3"
:ops
{:add-middleware {}
:analyze-last-stacktrace {}
:apropos {}
:cider-version {}
:cider.clj-reload/reload {}
:cider.clj-reload/reload-all {}
:cider.clj-reload/reload-clear {}
:cider/get-state {}
:cider/log-add-appender {}
:cider/log-add-consumer {}
:cider/log-clear-appender {}
:cider/log-exceptions {}
:cider/log-format-event {}
:cider/log-frameworks {}
:cider/log-inspect-event {}
:cider/log-levels {}
:cider/log-loggers {}
:cider/log-remove-appender {}
:cider/log-remove-consumer {}
:cider/log-search {}
:cider/log-threads {}
:cider/log-update-appender {}
:cider/log-update-consumer {}
:cider/profile-clear {}
:cider/profile-summary {}
:cider/profile-toggle-ns {}
:cider/profile-toggle-var {}
:classpath {}
:clojuredocs-lookup {}
:clojuredocs-refresh-cache {}
:clone {}
:close {}
:complete {}
:complete-doc {}
:complete-flush-caches {}
:completions {}
:content-type {}
:debug-input {}
:debug-instrumented-defs {}
:debug-middleware {}
:describe {}
:eldoc {}
:eldoc-datomic-query {}
:eval {}
:fn-deps {}
:fn-refs {}
:format-code {}
:format-edn {}
:forward-system-output {}
:info {}
:init-debugger {}
:inspect-clear {}
:inspect-def-current-value {}
:inspect-display-analytics {}
:inspect-last-exception {}
:inspect-next-page {}
:inspect-next-sibling {}
:inspect-pop {}
:inspect-prev-page {}
:inspect-previous-sibling {}
:inspect-print-current-value {}
:inspect-push {}
:inspect-refresh {}
:inspect-set-max-atom-length {}
:inspect-set-max-coll-size {}
:inspect-set-max-nested-depth {}
:inspect-set-page-size {}
:inspect-tap-current-value {}
:inspect-tap-indexed {}
:inspect-toggle-pretty-print {}
:inspect-toggle-view-mode {}
:interrupt {}
:load-file {}
:lookup {}
:ls-middleware {}
:ls-sessions {}
:macroexpand {}
:ns-aliases {}
:ns-list {}
:ns-list-vars-by-name {}
:ns-load-all {}
:ns-path {}
:ns-vars {}
:ns-vars-with-meta {}
:out-subscribe {}
:out-unsubscribe {}
:refresh {}
:refresh-all {}
:refresh-clear {}
:resource {}
:resources-list {}
:retest {}
:slurp {}
:spec-example {}
:spec-form {}
:spec-list {}
:stacktrace {}
:stdin {}
:swap-middleware {}
:test {}
:test-all {}
:test-stacktrace {}
:test-var-query {}
:toggle-trace-ns {}
:toggle-trace-var {}
:undef {}
:undef-all {}}
:session
"d99593a0-aaf6-4023-bd80-ac2dd5e73757"
:status
["done"]
:versions
{:clojure {:incremental 4 :major 1 :minor 12 :version-string "1.12.4"}
:java {:major 21 :version-string "21.0.9"}
:nrepl {:incremental 2 :major 1 :minor 5 :version-string "1.5.2"}}}
; --------------------------------------------------------------------------------
; Assumed session: Maltese (Unknown https://github.com/Olical/conjure/wiki/Frequently-asked-questions#what-does-unknown-mean-in-the-log-when-connecting-to-a-clojure-nrepl)
; debug: receive
{:id "a7a02df5-c289-47b6-bba7-3c9014cdf523"
:ns "user"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:value "clj"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "user"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#namespace[conjure.internal]"}
; debug: receive
{:id "a7a02df5-c289-47b6-bba7-3c9014cdf523"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["done"]}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "user"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/initial-ns"}
; debug: receive
{:changed-namespaces
{:clojure.core
{:aliases
{}
:interns
{:* {:fn "true"}
"*'" {:fn "true"}
:*1 {}
:*2 {}
:*3 {}
:*agent* {}
:*allow-unresolved-vars* {}
:*assert* {}
:*clojure-version* {}
:*command-line-args* {}
:*compile-files* {}
:*compile-path* {}
:*compiler-options* {}
:*data-readers* {}
:*default-data-reader-fn* {}
:*e {}
:*err* {}
:*file* {}
:*flush-on-newline* {}
:*fn-loader* {}
:*in* {}
:*loaded-libs* {}
:*loading-verbosely* {}
:*math-context* {}
:*ns* {}
:*out* {}
:*pending-paths* {}
:*print-dup* {}
:*print-length* {}
:*print-level* {}
:*print-meta* {}
:*print-namespace-maps* {}
:*print-readably* {}
:*read-eval* {}
:*reader-resolver* {}
:*repl* {}
:*source-path* {}
:*suppress-read* {}
:*unchecked-math* {}
:*use-context-classloader* {}
:*verbose-defrecords* {}
:*warn-on-reflection* {}
:+ {:fn "true"}
"+'" {:fn "true"}
:- {:fn "true"}
"-'" {:fn "true"}
:-> {:macro "true"}
:->> {:macro "true"}
:->ArrayChunk {:fn "true"}
:->Eduction {:fn "true"}
:->Vec {:fn "true"}
:->VecNode {:fn "true"}
:->VecSeq {:fn "true"}
:-cache-protocol-fn {:fn "true"}
:-reset-methods {:fn "true"}
:.. {:macro "true"}
:/ {:fn "true"}
:< {:fn "true"}
:<= {:fn "true"}
:= {:fn "true"}
:== {:fn "true"}
:> {:fn "true"}
:>0? {:fn "true"}
:>1? {:fn "true"}
:>= {:fn "true"}
:EMPTY-NODE {}
:Inst {}
:NaN? {:fn "true"}
:PrintWriter-on {:fn "true"}
:StackTraceElement->vec {:fn "true"}
:Throwable->map {:fn "true"}
:abs {:fn "true"}
:accessor {:fn "true"}
:aclone {:fn "true"}
:add-annotation {:fn "true"}
:add-annotations {:fn "true"}
:add-classpath {:deprecated "\"1.1\"" :fn "true"}
:add-doc-and-meta {:macro "true"}
:add-tap {:fn "true"}
:add-watch {:fn "true"}
:agent {:fn "true"}
:agent-error {:fn "true"}
:agent-errors {:deprecated "\"1.2\"" :fn "true"}
:aget {:fn "true"}
:alength {:fn "true"}
:alias {:fn "true"}
:all-ns {:fn "true"}
:alter {:fn "true"}
:alter-meta! {:fn "true"}
:alter-var-root {:fn "true"}
:amap {:macro "true"}
:ams {}
:ams-check {:macro "true"}
:ancestors {:fn "true"}
:and {:macro "true"}
:any? {:fn "true"}
:apply {:fn "true"}
:areduce {:macro "true"}
:array {:fn "true"}
:array-map {:fn "true"}
:as-> {:macro "true"}
:aset {:fn "true"}
:aset-boolean {:fn "true"}
:aset-byte {:fn "true"}
:aset-char {:fn "true"}
:aset-double {:fn "true"}
:aset-float {:fn "true"}
:aset-int {:fn "true"}
:aset-long {:fn "true"}
:aset-short {:fn "true"}
:asm-type {:fn "true"}
:assert {:macro "true"}
:assert-args {:macro "true"}
:assert-same-protocol {:fn "true"}
:assert-valid-fdecl {:fn "true"}
:assoc {:fn "true"}
:assoc! {:fn "true"}
:assoc-in {:fn "true"}
:associative? {:fn "true"}
:atom {:fn "true"}
:await {:fn "true"}
:await-for {:fn "true"}
:await1 {:fn "true"}
:bases {:fn "true"}
:bean {:fn "true"}
:bigdec {:fn "true"}
:bigint {:fn "true"}
:biginteger {:fn "true"}
:binding {:macro "true"}
:binding-conveyor-fn {:fn "true"}
:bit-and {:fn "true"}
:bit-and-not {:fn "true"}
:bit-clear {:fn "true"}
:bit-flip {:fn "true"}
:bit-not {:fn "true"}
:bit-or {:fn "true"}
:bit-set {:fn "true"}
:bit-shift-left {:fn "true"}
:bit-shift-right {:fn "true"}
:bit-test {:fn "true"}
:bit-xor {:fn "true"}
:boolean {:fn "true"}
:boolean-array {:fn "true"}
:boolean? {:fn "true"}
:booleans {:fn "true"}
:bound-fn {:macro "true"}
:bound-fn* {:fn "true"}
:bound? {:fn "true"}
:bounded-count {:fn "true"}
:build-positional-factory {:fn "true"}
:butlast {:fn "true"}
:byte {:fn "true"}
:byte-array {:fn "true"}
:bytes {:fn "true"}
:bytes? {:fn "true"}
:case {:macro "true"}
:case-map {:fn "true"}
:cast {:fn "true"}
:cat {:fn "true"}
:char {:fn "true"}
:char-array {:fn "true"}
:char-escape-string {}
:char-name-string {}
:char? {:fn "true"}
:chars {:fn "true"}
:check-cyclic-dependency {:fn "true"}
:check-valid-options {:fn "true"}
:chunk {:fn "true"}
:chunk-append {:fn "true"}
:chunk-buffer {:fn "true"}
:chunk-cons {:fn "true"}
:chunk-first {:fn "true"}
:chunk-next {:fn "true"}
:chunk-rest {:fn "true"}
:chunked-seq? {:fn "true"}
:class {:fn "true"}
:class? {:fn "true"}
:clear-agent-errors {:deprecated "\"1.2\"" :fn "true"}
:clojure-version {:fn "true"}
:coll? {:fn "true"}
:comment {:macro "true"}
:commute {:fn "true"}
:comp {:fn "true"}
:comparator {:fn "true"}
:compare {:fn "true"}
:compare-and-set! {:fn "true"}
:compile {:fn "true"}
:complement {:fn "true"}
:completing {:fn "true"}
:concat {:fn "true"}
:cond {:macro "true"}
:cond-> {:macro "true"}
:cond->> {:macro "true"}
:condp {:macro "true"}
:conj {:fn "true"}
:conj! {:fn "true"}
:cons {:fn "true"}
:constantly {:fn "true"}
:construct-proxy {:fn "true"}
:contains? {:fn "true"}
:count {:fn "true"}
:counted? {:fn "true"}
:create-ns {:fn "true"}
:create-struct {:fn "true"}
:ctor-sigs {:fn "true"}
:cycle {:fn "true"}
:data-reader-urls {:fn "true"}
:data-reader-var {:fn "true"}
:dec {:fn "true"}
"dec'" {:fn "true"}
:decimal? {:fn "true"}
:declare {:macro "true"}
:dedupe {:fn "true"}
:def-aset {:macro "true"}
:default-data-readers {}
:definline {:macro "true"}
:definterface {:macro "true"}
:defmacro {:macro "true"}
:defmethod {:macro "true"}
:defmulti {:macro "true"}
:defn {:macro "true"}
:defn- {:macro "true"}
:defonce {:macro "true"}
:defprotocol {:macro "true"}
:defrecord {:macro "true"}
:defstruct {:macro "true"}
:deftype {:macro "true"}
:delay {:macro "true"}
:delay? {:fn "true"}
:deliver {:fn "true"}
:denominator {:fn "true"}
:deref {:fn "true"}
:deref-as-map {:fn "true"}
:deref-future {:fn "true"}
:derive {:fn "true"}
:descendants {:fn "true"}
:descriptor {:fn "true"}
:destructure {:fn "true"}
:disj {:fn "true"}
:disj! {:fn "true"}
:dissoc {:fn "true"}
:dissoc! {:fn "true"}
:distinct {:fn "true"}
:distinct? {:fn "true"}
:doall {:fn "true"}
:dorun {:fn "true"}
:doseq {:macro "true"}
:dosync {:macro "true"}
:dotimes {:macro "true"}
:doto {:macro "true"}
:double {:fn "true"}
:double-array {:fn "true"}
:double? {:fn "true"}
:doubles {:fn "true"}
:drop {:fn "true"}
:drop-last {:fn "true"}
:drop-while {:fn "true"}
:eduction {:fn "true"}
:elide-top-frames {:fn "true"}
:emit-defrecord {:fn "true"}
:emit-deftype* {:fn "true"}
:emit-extend-protocol {:fn "true"}
:emit-extend-type {:fn "true"}
:emit-hinted-impl {:fn "true"}
:emit-impl {:fn "true"}
:emit-method-builder {:fn "true"}
:emit-protocol {:fn "true"}
:empty {:fn "true"}
:empty? {:fn "true"}
:ensure {:fn "true"}
:ensure-reduced {:fn "true"}
:enumeration-seq {:fn "true"}
:error-handler {:fn "true"}
:error-mode {:fn "true"}
:escape-class-name {:fn "true"}
:eval {:fn "true"}
:even? {:fn "true"}
:every-pred {:fn "true"}
:every? {:fn "true"}
:ex-cause {:fn "true"}
:ex-data {:fn "true"}
:ex-info {:fn "true"}
:ex-message {:fn "true"}
:expand-method-impl-cache {:fn "true"}
:extend {:fn "true"}
:extend-protocol {:macro "true"}
:extend-type {:macro "true"}
:extenders {:fn "true"}
:extends? {:fn "true"}
:false? {:fn "true"}
:ffirst {:fn "true"}
:file-seq {:fn "true"}
:filter {:fn "true"}
:filter-key {:fn "true"}
:filter-methods {:fn "true"}
:filterv {:fn "true"}
:find {:fn "true"}
:find-field {:fn "true"}
:find-keyword {:fn "true"}
:find-ns {:fn "true"}
:find-protocol-impl {:fn "true"}
:find-protocol-method {:fn "true"}
:find-var {:fn "true"}
:first {:fn "true"}
:fits-table? {:fn "true"}
:flatten {:fn "true"}
:float {:fn "true"}
:float-array {:fn "true"}
:float? {:fn "true"}
:floats {:fn "true"}
:flush {:fn "true"}
:fn {:macro "true"}
:fn? {:fn "true"}
:fnext {:fn "true"}
:fnil {:fn "true"}
:for {:macro "true"}
:force {:fn "true"}
:format {:fn "true"}
:frequencies {:fn "true"}
:future {:macro "true"}
:future-call {:fn "true"}
:future-cancel {:fn "true"}
:future-cancelled? {:fn "true"}
:future-done? {:fn "true"}
:future? {:fn "true"}
:gen-class {:macro "true"}
:gen-interface {:macro "true"}
:generate-class {:fn "true"}
:generate-interface {:fn "true"}
:generate-proxy {:fn "true"}
:gensym {:fn "true"}
:get {:fn "true"}
:get-in {:fn "true"}
:get-method {:fn "true"}
:get-proxy-class {:fn "true"}
:get-super-and-interfaces {:fn "true"}
:get-thread-bindings {:fn "true"}
:get-validator {:fn "true"}
:global-hierarchy {}
:group-by {:fn "true"}
:group-by-sig {:fn "true"}
:halt-when {:fn "true"}
:hash {:fn "true"}
:hash-combine {:fn "true"}
:hash-map {:fn "true"}
:hash-ordered-coll {:fn "true"}
:hash-set {:fn "true"}
:hash-unordered-coll {:fn "true"}
:ident? {:fn "true"}
:identical? {:fn "true"}
:identity {:fn "true"}
:if-let {:macro "true"}
:if-not {:macro "true"}
:if-some {:macro "true"}
:ifn? {:fn "true"}
:imap-cons {:fn "true"}
:implements? {:fn "true"}
:import {:macro "true"}
:in-ns {}
:inc {:fn "true"}
"inc'" {:fn "true"}
:indexed? {:fn "true"}
:infinite? {:fn "true"}
:init-proxy {:fn "true"}
:inst-ms {:fn "true"}
:inst-ms* {:fn "true"}
:inst? {:fn "true"}
:instance? {:fn "true"}
:int {:fn "true"}
:int-array {:fn "true"}
:int? {:fn "true"}
:integer? {:fn "true"}
:interleave {:fn "true"}
:intern {:fn "true"}
:interpose {:fn "true"}
:into {:fn "true"}
:into-array {:fn "true"}
:into1 {:fn "true"}
:ints {:fn "true"}
:io! {:macro "true"}
:is-annotation? {:fn "true"}
:is-runtime-annotation? {:fn "true"}
:isa? {:fn "true"}
:iterate {:fn "true"}
:iteration {:fn "true"}
:iterator-seq {:fn "true"}
:juxt {:fn "true"}
:keep {:fn "true"}
:keep-indexed {:fn "true"}
:key {:fn "true"}
:keys {:fn "true"}
:keyword {:fn "true"}
:keyword? {:fn "true"}
:last {:fn "true"}
:lazy-cat {:macro "true"}
:lazy-seq {:macro "true"}
:let {:macro "true"}
:letfn {:macro "true"}
:libspec? {:fn "true"}
:lift-ns {:fn "true"}
:line-seq {:fn "true"}
:list {:fn "true"}
:list* {:fn "true"}
:list? {:fn "true"}
:load {:fn "true"}
:load-all {:fn "true"}
:load-data-reader-file {:fn "true"}
:load-data-readers {:fn "true"}
:load-file {}
:load-lib {:fn "true"}
:load-libs {:fn "true"}
:load-one {:fn "true"}
:load-reader {:fn "true"}
:load-string {:fn "true"}
:loaded-libs {:fn "true"}
:locking {:macro "true"}
:long {:fn "true"}
:long-array {:fn "true"}
:longs {:fn "true"}
:loop {:macro "true"}
:macroexpand {:fn "true"}
:macroexpand-1 {:fn "true"}
:make-array {:fn "true"}
:make-hierarchy {:fn "true"}
:map {:fn "true"}
:map-entry? {:fn "true"}
:map-indexed {:fn "true"}
:map? {:fn "true"}
:mapcat {:fn "true"}
:mapv {:fn "true"}
:max {:fn "true"}
:max-key {:fn "true"}
:max-mask-bits {}
:max-switch-table-size {}
:maybe-destructured {:fn "true"}
:maybe-min-hash {:fn "true"}
:memfn {:macro "true"}
:memoize {:fn "true"}
:merge {:fn "true"}
:merge-hash-collisions {:fn "true"}
:merge-with {:fn "true"}
:meta {:fn "true"}
:method-sig {:fn "true"}
:methods {:fn "true"}
:min {:fn "true"}
:min-key {:fn "true"}
:mix-collection-hash {:fn "true"}
:mk-am {:macro "true"}
:mk-bound-fn {:fn "true"}
:mod {:fn "true"}
:most-specific {:fn "true"}
:munge {:fn "true"}
:name {:fn "true"}
:namespace {:fn "true"}
:namespace-munge {:fn "true"}
:nary-inline {:fn "true"}
:nat-int? {:fn "true"}
:neg-int? {:fn "true"}
:neg? {:fn "true"}
:newline {:fn "true"}
:next {:fn "true"}
:nfirst {:fn "true"}
:nil? {:fn "true"}
:nnext {:fn "true"}
:non-private-methods {:fn "true"}
:normalize-slurp-opts {:fn "true"}
:not {:fn "true"}
:not-any? {:fn "true"}
:not-empty {:fn "true"}
:not-every? {:fn "true"}
:not= {:fn "true"}
:ns {:macro "true"}
:ns-aliases {:fn "true"}
:ns-imports {:fn "true"}
:ns-interns {:fn "true"}
:ns-map {:fn "true"}
:ns-name {:fn "true"}
:ns-publics {:fn "true"}
:ns-refers {:fn "true"}
:ns-resolve {:fn "true"}
:ns-unalias {:fn "true"}
:ns-unmap {:fn "true"}
:nth {:fn "true"}
:nthnext {:fn "true"}
:nthrest {:fn "true"}
:num {:fn "true"}
:number? {:fn "true"}
:numerator {:fn "true"}
:object-array {:fn "true"}
:odd? {:fn "true"}
:or {:macro "true"}
:overload-name {:fn "true"}
:parents {:fn "true"}
:parse-boolean {:fn "true"}
:parse-double {:fn "true"}
:parse-impls {:fn "true"}
:parse-long {:fn "true"}
:parse-opts {:fn "true"}
:parse-opts+specs {:fn "true"}
:parse-uuid {:fn "true"}
:parsing-err {:fn "true"}
:partial {:fn "true"}
:partition {:fn "true"}
:partition-all {:fn "true"}
:partition-by {:fn "true"}
:partitionv {:fn "true"}
:partitionv-all {:fn "true"}
:pcalls {:fn "true"}
:peek {:fn "true"}
:persistent! {:fn "true"}
:pmap {:fn "true"}
:pop {:fn "true"}
:pop! {:fn "true"}
:pop-thread-bindings {:fn "true"}
:pos-int? {:fn "true"}
:pos? {:fn "true"}
:pr {:fn "true"}
:pr-on {:fn "true"}
:pr-str {:fn "true"}
:pref {:fn "true"}
:prefer-method {:fn "true"}
:prefers {:fn "true"}
:prep-hashes {:fn "true"}
:prep-ints {:fn "true"}
:prependss {:fn "true"}
:preserving-reduced {:fn "true"}
:prim->class {}
:primitives-classnames {}
:print {:fn "true"}
:print-ctor {:fn "true"}
:print-dup {:fn "true"}
:print-initialized {}
:print-map {:fn "true"}
:print-meta {:fn "true"}
:print-method {:fn "true"}
:print-object {:fn "true"}
:print-prefix-map {:fn "true"}
:print-sequential {:fn "true"}
:print-simple {:fn "true"}
:print-str {:fn "true"}
:print-tagged-object {:fn "true"}
:print-throwable {:fn "true"}
:printf {:fn "true"}
:println {:fn "true"}
:println-str {:fn "true"}
:prn {:fn "true"}
:prn-str {:fn "true"}
:process-annotation {:fn "true"}
:promise {:fn "true"}
:protected-final-methods {:fn "true"}
:protocol? {:fn "true"}
:proxy {:macro "true"}
:proxy-call-with-super {:fn "true"}
:proxy-mappings {:fn "true"}
:proxy-name {:fn "true"}
:proxy-super {:macro "true"}
:push-thread-bindings {:fn "true"}
:pvalues {:macro "true"}
:qualified-ident? {:fn "true"}
:qualified-keyword? {:fn "true"}
:qualified-symbol? {:fn "true"}
:quot {:fn "true"}
:rand {:fn "true"}
:rand-int {:fn "true"}
:rand-nth {:fn "true"}
:random-sample {:fn "true"}
:random-uuid {:fn "true"}
:range {:fn "true"}
:ratio? {:fn "true"}
:rational? {:fn "true"}
:rationalize {:fn "true"}
:re-find {:fn "true"}
:re-groups {:fn "true"}
:re-matcher {:fn "true"}
:re-matches {:fn "true"}
:re-pattern {:fn "true"}
:re-seq {:fn "true"}
:read {:fn "true"}
:read+string {:fn "true"}
:read-line {:fn "true"}
:read-string {:fn "true"}
:reader-conditional {:fn "true"}
:reader-conditional? {:fn "true"}
:realized? {:fn "true"}
:record? {:fn "true"}
:reduce {:fn "true"}
:reduce-kv {:fn "true"}
:reduce1 {:fn "true"}
:reduced {:fn "true"}
:reduced? {:fn "true"}
:reductions {:fn "true"}
:ref {:fn "true"}
:ref-history-count {:fn "true"}
:ref-max-history {:fn "true"}
:ref-min-history {:fn "true"}
:ref-set {:fn "true"}
:refer {:fn "true"}
:refer-clojure {:macro "true"}
:reify {:macro "true"}
:release-pending-sends {:fn "true"}
:rem {:fn "true"}
:remove {:fn "true"}
:remove-all-methods {:fn "true"}
:remove-method {:fn "true"}
:remove-ns {:fn "true"}
:remove-tap {:fn "true"}
:remove-watch {:fn "true"}
:repeat {:fn "true"}
:repeatedly {:fn "true"}
:replace {:fn "true"}
:replicate {:deprecated "\"1.3\"" :fn "true"}
:require {:fn "true"}
:requiring-resolve {:fn "true"}
:reset! {:fn "true"}
:reset-meta! {:fn "true"}
:reset-vals! {:fn "true"}
:resolve {:fn "true"}
:rest {:fn "true"}
:restart-agent {:fn "true"}
:resultset-seq {:fn "true"}
:reverse {:fn "true"}
:reversible? {:fn "true"}
:root-directory {:fn "true"}
:root-resource {:fn "true"}
:rseq {:fn "true"}
:rsubseq {:fn "true"}
:run! {:fn "true"}
:satisfies? {:fn "true"}
:second {:fn "true"}
:select-keys {:fn "true"}
:send {:fn "true"}
:send-off {:fn "true"}
:send-via {:fn "true"}
:seq {:fn "true"}
:seq-to-map-for-destructuring {:fn "true"}
:seq? {:fn "true"}
:seqable? {:fn "true"}
:seque {:fn "true"}
:sequence {:fn "true"}
:sequential? {:fn "true"}
:serialized-require {:fn "true"}
:set {:fn "true"}
:set-agent-send-executor! {:fn "true"}
:set-agent-send-off-executor! {:fn "true"}
:set-error-handler! {:fn "true"}
:set-error-mode! {:fn "true"}
:set-validator! {:fn "true"}
:set? {:fn "true"}
:setup-reference {:fn "true"}
:shift-mask {:fn "true"}
:short {:fn "true"}
:short-array {:fn "true"}
:shorts {:fn "true"}
:shuffle {:fn "true"}
:shutdown-agents {:fn "true"}
:sigs {:fn "true"}
:simple-ident? {:fn "true"}
:simple-keyword? {:fn "true"}
:simple-symbol? {:fn "true"}
:slurp {:fn "true"}
:some {:fn "true"}
:some-> {:macro "true"}
:some->> {:macro "true"}
:some-fn {:fn "true"}
:some? {:fn "true"}
:sort {:fn "true"}
:sort-by {:fn "true"}
:sorted-map {:fn "true"}
:sorted-map-by {:fn "true"}
:sorted-set {:fn "true"}
:sorted-set-by {:fn "true"}
:sorted? {:fn "true"}
:special-symbol? {:fn "true"}
:spit {:fn "true"}
:split-at {:fn "true"}
:split-with {:fn "true"}
:splitv-at {:fn "true"}
:spread {:fn "true"}
:str {:fn "true"}
:stream-into! {:fn "true"}
:stream-reduce! {:fn "true"}
:stream-seq! {:fn "true"}
:stream-transduce! {:fn "true"}
:string? {:fn "true"}
:strip-ns {:fn "true"}
:struct {:fn "true"}
:struct-map {:fn "true"}
:subs {:fn "true"}
:subseq {:fn "true"}
:subvec {:fn "true"}
:super-chain {:fn "true"}
:supers {:fn "true"}
:swap! {:fn "true"}
:swap-vals! {:fn "true"}
:symbol {:fn "true"}
:symbol? {:fn "true"}
:sync {:macro "true"}
:system-newline {}
:tagged-literal {:fn "true"}
:tagged-literal? {:fn "true"}
:take {:fn "true"}
:take-last {:fn "true"}
:take-nth {:fn "true"}
:take-while {:fn "true"}
:tap-loop {}
:tap> {:fn "true"}
:tapq {}
:tapset {}
:test {:fn "true"}
:the-array-class {:fn "true"}
:the-class {:fn "true"}
:the-ns {:fn "true"}
:thread-bound? {:fn "true"}
:throw-if {:fn "true"}
:time {:macro "true"}
:to-array {:fn "true"}
:to-array-2d {:fn "true"}
:trampoline {:fn "true"}
:transduce {:fn "true"}
:transient {:fn "true"}
:tree-seq {:fn "true"}
:true? {:fn "true"}
:type {:fn "true"}
:unchecked-add {:fn "true"}
:unchecked-add-int {:fn "true"}
:unchecked-byte {:fn "true"}
:unchecked-char {:fn "true"}
:unchecked-dec {:fn "true"}
:unchecked-dec-int {:fn "true"}
:unchecked-divide-int {:fn "true"}
:unchecked-double {:fn "true"}
:unchecked-float {:fn "true"}
:unchecked-inc {:fn "true"}
:unchecked-inc-int {:fn "true"}
:unchecked-int {:fn "true"}
:unchecked-long {:fn "true"}
:unchecked-multiply {:fn "true"}
:unchecked-multiply-int {:fn "true"}
:unchecked-negate {:fn "true"}
:unchecked-negate-int {:fn "true"}
:unchecked-remainder-int {:fn "true"}
:unchecked-short {:fn "true"}
:unchecked-subtract {:fn "true"}
:unchecked-subtract-int {:fn "true"}
:underive {:fn "true"}
:unquote {}
:unquote-splicing {}
:unreduced {:fn "true"}
:unsigned-bit-shift-right {:fn "true"}
:update {:fn "true"}
:update-in {:fn "true"}
:update-keys {:fn "true"}
:update-proxy {:fn "true"}
:update-vals {:fn "true"}
:uri? {:fn "true"}
:use {:fn "true"}
:uuid? {:fn "true"}
:val {:fn "true"}
:valid-java-method-name {:fn "true"}
:validate-fields {:fn "true"}
:validate-generate-class-options {:fn "true"}
:vals {:fn "true"}
:var-get {:fn "true"}
:var-set {:fn "true"}
:var? {:fn "true"}
:vary-meta {:fn "true"}
:vec {:fn "true"}
:vector {:fn "true"}
:vector-of {:fn "true"}
:vector? {:fn "true"}
:volatile! {:fn "true"}
:volatile? {:fn "true"}
:vreset! {:fn "true"}
:vswap! {:macro "true"}
:when {:macro "true"}
:when-class {:macro "true"}
:when-first {:macro "true"}
:when-let {:macro "true"}
:when-not {:macro "true"}
:when-some {:macro "true"}
:while {:macro "true"}
:with-bindings {:macro "true"}
:with-bindings* {:fn "true"}
:with-in-str {:macro "true"}
:with-loading-context {:macro "true"}
:with-local-vars {:macro "true"}
:with-meta {:fn "true"}
:with-open {:macro "true"}
:with-out-str {:macro "true"}
:with-precision {:macro "true"}
:with-redefs {:macro "true"}
:with-redefs-fn {:fn "true"}
:xml-seq {:fn "true"}
:zero? {:fn "true"}
:zipmap {:fn "true"}}}
:conjure.internal
{:aliases {} :interns {:initial-ns {}}}
:user
{:aliases {} :interns {}}}
:id
"a7a02df5-c289-47b6-bba7-3c9014cdf523"
:repl-type
"clj"
:session
"44c3284a-41df-4f7e-a66d-bb30f484db91"
:status
["state"]}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "nil"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "nil"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/bounded-conj"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/tap-queue-size"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/tap-queue!"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/enqueue-tap!"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "nil"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#'conjure.internal/dump-tap-queue!"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "conjure.internal"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#multifn[report 0x311fbd11]"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:ns "user"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:value "#namespace[user]"}
; debug: receive
{:id "04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:session "009bbab1-de19-4cd1-9872-7ce3b57e4566"
:status ["done"]}
; debug: receive
{:changed-namespaces
{:clojure.core
{:aliases
{}
:interns
{:* {:fn "true"}
"*'" {:fn "true"}
:*1 {}
:*2 {}
:*3 {}
:*agent* {}
:*allow-unresolved-vars* {}
:*assert* {}
:*clojure-version* {}
:*command-line-args* {}
:*compile-files* {}
:*compile-path* {}
:*compiler-options* {}
:*data-readers* {}
:*default-data-reader-fn* {}
:*e {}
:*err* {}
:*file* {}
:*flush-on-newline* {}
:*fn-loader* {}
:*in* {}
:*loaded-libs* {}
:*loading-verbosely* {}
:*math-context* {}
:*ns* {}
:*out* {}
:*pending-paths* {}
:*print-dup* {}
:*print-length* {}
:*print-level* {}
:*print-meta* {}
:*print-namespace-maps* {}
:*print-readably* {}
:*read-eval* {}
:*reader-resolver* {}
:*repl* {}
:*source-path* {}
:*suppress-read* {}
:*unchecked-math* {}
:*use-context-classloader* {}
:*verbose-defrecords* {}
:*warn-on-reflection* {}
:+ {:fn "true"}
"+'" {:fn "true"}
:- {:fn "true"}
"-'" {:fn "true"}
:-> {:macro "true"}
:->> {:macro "true"}
:->ArrayChunk {:fn "true"}
:->Eduction {:fn "true"}
:->Vec {:fn "true"}
:->VecNode {:fn "true"}
:->VecSeq {:fn "true"}
:-cache-protocol-fn {:fn "true"}
:-reset-methods {:fn "true"}
:.. {:macro "true"}
:/ {:fn "true"}
:< {:fn "true"}
:<= {:fn "true"}
:= {:fn "true"}
:== {:fn "true"}
:> {:fn "true"}
:>0? {:fn "true"}
:>1? {:fn "true"}
:>= {:fn "true"}
:EMPTY-NODE {}
:Inst {}
:NaN? {:fn "true"}
:PrintWriter-on {:fn "true"}
:StackTraceElement->vec {:fn "true"}
:Throwable->map {:fn "true"}
:abs {:fn "true"}
:accessor {:fn "true"}
:aclone {:fn "true"}
:add-annotation {:fn "true"}
:add-annotations {:fn "true"}
:add-classpath {:deprecated "\"1.1\"" :fn "true"}
:add-doc-and-meta {:macro "true"}
:add-tap {:fn "true"}
:add-watch {:fn "true"}
:agent {:fn "true"}
:agent-error {:fn "true"}
:agent-errors {:deprecated "\"1.2\"" :fn "true"}
:aget {:fn "true"}
:alength {:fn "true"}
:alias {:fn "true"}
:all-ns {:fn "true"}
:alter {:fn "true"}
:alter-meta! {:fn "true"}
:alter-var-root {:fn "true"}
:amap {:macro "true"}
:ams {}
:ams-check {:macro "true"}
:ancestors {:fn "true"}
:and {:macro "true"}
:any? {:fn "true"}
:apply {:fn "true"}
:areduce {:macro "true"}
:array {:fn "true"}
:array-map {:fn "true"}
:as-> {:macro "true"}
:aset {:fn "true"}
:aset-boolean {:fn "true"}
:aset-byte {:fn "true"}
:aset-char {:fn "true"}
:aset-double {:fn "true"}
:aset-float {:fn "true"}
:aset-int {:fn "true"}
:aset-long {:fn "true"}
:aset-short {:fn "true"}
:asm-type {:fn "true"}
:assert {:macro "true"}
:assert-args {:macro "true"}
:assert-same-protocol {:fn "true"}
:assert-valid-fdecl {:fn "true"}
:assoc {:fn "true"}
:assoc! {:fn "true"}
:assoc-in {:fn "true"}
:associative? {:fn "true"}
:atom {:fn "true"}
:await {:fn "true"}
:await-for {:fn "true"}
:await1 {:fn "true"}
:bases {:fn "true"}
:bean {:fn "true"}
:bigdec {:fn "true"}
:bigint {:fn "true"}
:biginteger {:fn "true"}
:binding {:macro "true"}
:binding-conveyor-fn {:fn "true"}
:bit-and {:fn "true"}
:bit-and-not {:fn "true"}
:bit-clear {:fn "true"}
:bit-flip {:fn "true"}
:bit-not {:fn "true"}
:bit-or {:fn "true"}
:bit-set {:fn "true"}
:bit-shift-left {:fn "true"}
:bit-shift-right {:fn "true"}
:bit-test {:fn "true"}
:bit-xor {:fn "true"}
:boolean {:fn "true"}
:boolean-array {:fn "true"}
:boolean? {:fn "true"}
:booleans {:fn "true"}
:bound-fn {:macro "true"}
:bound-fn* {:fn "true"}
:bound? {:fn "true"}
:bounded-count {:fn "true"}
:build-positional-factory {:fn "true"}
:butlast {:fn "true"}
:byte {:fn "true"}
:byte-array {:fn "true"}
:bytes {:fn "true"}
:bytes? {:fn "true"}
:case {:macro "true"}
:case-map {:fn "true"}
:cast {:fn "true"}
:cat {:fn "true"}
:char {:fn "true"}
:char-array {:fn "true"}
:char-escape-string {}
:char-name-string {}
:char? {:fn "true"}
:chars {:fn "true"}
:check-cyclic-dependency {:fn "true"}
:check-valid-options {:fn "true"}
:chunk {:fn "true"}
:chunk-append {:fn "true"}
:chunk-buffer {:fn "true"}
:chunk-cons {:fn "true"}
:chunk-first {:fn "true"}
:chunk-next {:fn "true"}
:chunk-rest {:fn "true"}
:chunked-seq? {:fn "true"}
:class {:fn "true"}
:class? {:fn "true"}
:clear-agent-errors {:deprecated "\"1.2\"" :fn "true"}
:clojure-version {:fn "true"}
:coll? {:fn "true"}
:comment {:macro "true"}
:commute {:fn "true"}
:comp {:fn "true"}
:comparator {:fn "true"}
:compare {:fn "true"}
:compare-and-set! {:fn "true"}
:compile {:fn "true"}
:complement {:fn "true"}
:completing {:fn "true"}
:concat {:fn "true"}
:cond {:macro "true"}
:cond-> {:macro "true"}
:cond->> {:macro "true"}
:condp {:macro "true"}
:conj {:fn "true"}
:conj! {:fn "true"}
:cons {:fn "true"}
:constantly {:fn "true"}
:construct-proxy {:fn "true"}
:contains? {:fn "true"}
:count {:fn "true"}
:counted? {:fn "true"}
:create-ns {:fn "true"}
:create-struct {:fn "true"}
:ctor-sigs {:fn "true"}
:cycle {:fn "true"}
:data-reader-urls {:fn "true"}
:data-reader-var {:fn "true"}
:dec {:fn "true"}
"dec'" {:fn "true"}
:decimal? {:fn "true"}
:declare {:macro "true"}
:dedupe {:fn "true"}
:def-aset {:macro "true"}
:default-data-readers {}
:definline {:macro "true"}
:definterface {:macro "true"}
:defmacro {:macro "true"}
:defmethod {:macro "true"}
:defmulti {:macro "true"}
:defn {:macro "true"}
:defn- {:macro "true"}
:defonce {:macro "true"}
:defprotocol {:macro "true"}
:defrecord {:macro "true"}
:defstruct {:macro "true"}
:deftype {:macro "true"}
:delay {:macro "true"}
:delay? {:fn "true"}
:deliver {:fn "true"}
:denominator {:fn "true"}
:deref {:fn "true"}
:deref-as-map {:fn "true"}
:deref-future {:fn "true"}
:derive {:fn "true"}
:descendants {:fn "true"}
:descriptor {:fn "true"}
:destructure {:fn "true"}
:disj {:fn "true"}
:disj! {:fn "true"}
:dissoc {:fn "true"}
:dissoc! {:fn "true"}
:distinct {:fn "true"}
:distinct? {:fn "true"}
:doall {:fn "true"}
:dorun {:fn "true"}
:doseq {:macro "true"}
:dosync {:macro "true"}
:dotimes {:macro "true"}
:doto {:macro "true"}
:double {:fn "true"}
:double-array {:fn "true"}
:double? {:fn "true"}
:doubles {:fn "true"}
:drop {:fn "true"}
:drop-last {:fn "true"}
:drop-while {:fn "true"}
:eduction {:fn "true"}
:elide-top-frames {:fn "true"}
:emit-defrecord {:fn "true"}
:emit-deftype* {:fn "true"}
:emit-extend-protocol {:fn "true"}
:emit-extend-type {:fn "true"}
:emit-hinted-impl {:fn "true"}
:emit-impl {:fn "true"}
:emit-method-builder {:fn "true"}
:emit-protocol {:fn "true"}
:empty {:fn "true"}
:empty? {:fn "true"}
:ensure {:fn "true"}
:ensure-reduced {:fn "true"}
:enumeration-seq {:fn "true"}
:error-handler {:fn "true"}
:error-mode {:fn "true"}
:escape-class-name {:fn "true"}
:eval {:fn "true"}
:even? {:fn "true"}
:every-pred {:fn "true"}
:every? {:fn "true"}
:ex-cause {:fn "true"}
:ex-data {:fn "true"}
:ex-info {:fn "true"}
:ex-message {:fn "true"}
:expand-method-impl-cache {:fn "true"}
:extend {:fn "true"}
:extend-protocol {:macro "true"}
:extend-type {:macro "true"}
:extenders {:fn "true"}
:extends? {:fn "true"}
:false? {:fn "true"}
:ffirst {:fn "true"}
:file-seq {:fn "true"}
:filter {:fn "true"}
:filter-key {:fn "true"}
:filter-methods {:fn "true"}
:filterv {:fn "true"}
:find {:fn "true"}
:find-field {:fn "true"}
:find-keyword {:fn "true"}
:find-ns {:fn "true"}
:find-protocol-impl {:fn "true"}
:find-protocol-method {:fn "true"}
:find-var {:fn "true"}
:first {:fn "true"}
:fits-table? {:fn "true"}
:flatten {:fn "true"}
:float {:fn "true"}
:float-array {:fn "true"}
:float? {:fn "true"}
:floats {:fn "true"}
:flush {:fn "true"}
:fn {:macro "true"}
:fn? {:fn "true"}
:fnext {:fn "true"}
:fnil {:fn "true"}
:for {:macro "true"}
:force {:fn "true"}
:format {:fn "true"}
:frequencies {:fn "true"}
:future {:macro "true"}
:future-call {:fn "true"}
:future-cancel {:fn "true"}
:future-cancelled? {:fn "true"}
:future-done? {:fn "true"}
:future? {:fn "true"}
:gen-class {:macro "true"}
:gen-interface {:macro "true"}
:generate-class {:fn "true"}
:generate-interface {:fn "true"}
:generate-proxy {:fn "true"}
:gensym {:fn "true"}
:get {:fn "true"}
:get-in {:fn "true"}
:get-method {:fn "true"}
:get-proxy-class {:fn "true"}
:get-super-and-interfaces {:fn "true"}
:get-thread-bindings {:fn "true"}
:get-validator {:fn "true"}
:global-hierarchy {}
:group-by {:fn "true"}
:group-by-sig {:fn "true"}
:halt-when {:fn "true"}
:hash {:fn "true"}
:hash-combine {:fn "true"}
:hash-map {:fn "true"}
:hash-ordered-coll {:fn "true"}
:hash-set {:fn "true"}
:hash-unordered-coll {:fn "true"}
:ident? {:fn "true"}
:identical? {:fn "true"}
:identity {:fn "true"}
:if-let {:macro "true"}
:if-not {:macro "true"}
:if-some {:macro "true"}
:ifn? {:fn "true"}
:imap-cons {:fn "true"}
:implements? {:fn "true"}
:import {:macro "true"}
:in-ns {}
:inc {:fn "true"}
"inc'" {:fn "true"}
:indexed? {:fn "true"}
:infinite? {:fn "true"}
:init-proxy {:fn "true"}
:inst-ms {:fn "true"}
:inst-ms* {:fn "true"}
:inst? {:fn "true"}
:instance? {:fn "true"}
:int {:fn "true"}
:int-array {:fn "true"}
:int? {:fn "true"}
:integer? {:fn "true"}
:interleave {:fn "true"}
:intern {:fn "true"}
:interpose {:fn "true"}
:into {:fn "true"}
:into-array {:fn "true"}
:into1 {:fn "true"}
:ints {:fn "true"}
:io! {:macro "true"}
:is-annotation? {:fn "true"}
:is-runtime-annotation? {:fn "true"}
:isa? {:fn "true"}
:iterate {:fn "true"}
:iteration {:fn "true"}
:iterator-seq {:fn "true"}
:juxt {:fn "true"}
:keep {:fn "true"}
:keep-indexed {:fn "true"}
:key {:fn "true"}
:keys {:fn "true"}
:keyword {:fn "true"}
:keyword? {:fn "true"}
:last {:fn "true"}
:lazy-cat {:macro "true"}
:lazy-seq {:macro "true"}
:let {:macro "true"}
:letfn {:macro "true"}
:libspec? {:fn "true"}
:lift-ns {:fn "true"}
:line-seq {:fn "true"}
:list {:fn "true"}
:list* {:fn "true"}
:list? {:fn "true"}
:load {:fn "true"}
:load-all {:fn "true"}
:load-data-reader-file {:fn "true"}
:load-data-readers {:fn "true"}
:load-file {}
:load-lib {:fn "true"}
:load-libs {:fn "true"}
:load-one {:fn "true"}
:load-reader {:fn "true"}
:load-string {:fn "true"}
:loaded-libs {:fn "true"}
:locking {:macro "true"}
:long {:fn "true"}
:long-array {:fn "true"}
:longs {:fn "true"}
:loop {:macro "true"}
:macroexpand {:fn "true"}
:macroexpand-1 {:fn "true"}
:make-array {:fn "true"}
:make-hierarchy {:fn "true"}
:map {:fn "true"}
:map-entry? {:fn "true"}
:map-indexed {:fn "true"}
:map? {:fn "true"}
:mapcat {:fn "true"}
:mapv {:fn "true"}
:max {:fn "true"}
:max-key {:fn "true"}
:max-mask-bits {}
:max-switch-table-size {}
:maybe-destructured {:fn "true"}
:maybe-min-hash {:fn "true"}
:memfn {:macro "true"}
:memoize {:fn "true"}
:merge {:fn "true"}
:merge-hash-collisions {:fn "true"}
:merge-with {:fn "true"}
:meta {:fn "true"}
:method-sig {:fn "true"}
:methods {:fn "true"}
:min {:fn "true"}
:min-key {:fn "true"}
:mix-collection-hash {:fn "true"}
:mk-am {:macro "true"}
:mk-bound-fn {:fn "true"}
:mod {:fn "true"}
:most-specific {:fn "true"}
:munge {:fn "true"}
:name {:fn "true"}
:namespace {:fn "true"}
:namespace-munge {:fn "true"}
:nary-inline {:fn "true"}
:nat-int? {:fn "true"}
:neg-int? {:fn "true"}
:neg? {:fn "true"}
:newline {:fn "true"}
:next {:fn "true"}
:nfirst {:fn "true"}
:nil? {:fn "true"}
:nnext {:fn "true"}
:non-private-methods {:fn "true"}
:normalize-slurp-opts {:fn "true"}
:not {:fn "true"}
:not-any? {:fn "true"}
:not-empty {:fn "true"}
:not-every? {:fn "true"}
:not= {:fn "true"}
:ns {:macro "true"}
:ns-aliases {:fn "true"}
:ns-imports {:fn "true"}
:ns-interns {:fn "true"}
:ns-map {:fn "true"}
:ns-name {:fn "true"}
:ns-publics {:fn "true"}
:ns-refers {:fn "true"}
:ns-resolve {:fn "true"}
:ns-unalias {:fn "true"}
:ns-unmap {:fn "true"}
:nth {:fn "true"}
:nthnext {:fn "true"}
:nthrest {:fn "true"}
:num {:fn "true"}
:number? {:fn "true"}
:numerator {:fn "true"}
:object-array {:fn "true"}
:odd? {:fn "true"}
:or {:macro "true"}
:overload-name {:fn "true"}
:parents {:fn "true"}
:parse-boolean {:fn "true"}
:parse-double {:fn "true"}
:parse-impls {:fn "true"}
:parse-long {:fn "true"}
:parse-opts {:fn "true"}
:parse-opts+specs {:fn "true"}
:parse-uuid {:fn "true"}
:parsing-err {:fn "true"}
:partial {:fn "true"}
:partition {:fn "true"}
:partition-all {:fn "true"}
:partition-by {:fn "true"}
:partitionv {:fn "true"}
:partitionv-all {:fn "true"}
:pcalls {:fn "true"}
:peek {:fn "true"}
:persistent! {:fn "true"}
:pmap {:fn "true"}
:pop {:fn "true"}
:pop! {:fn "true"}
:pop-thread-bindings {:fn "true"}
:pos-int? {:fn "true"}
:pos? {:fn "true"}
:pr {:fn "true"}
:pr-on {:fn "true"}
:pr-str {:fn "true"}
:pref {:fn "true"}
:prefer-method {:fn "true"}
:prefers {:fn "true"}
:prep-hashes {:fn "true"}
:prep-ints {:fn "true"}
:prependss {:fn "true"}
:preserving-reduced {:fn "true"}
:prim->class {}
:primitives-classnames {}
:print {:fn "true"}
:print-ctor {:fn "true"}
:print-dup {:fn "true"}
:print-initialized {}
:print-map {:fn "true"}
:print-meta {:fn "true"}
:print-method {:fn "true"}
:print-object {:fn "true"}
:print-prefix-map {:fn "true"}
:print-sequential {:fn "true"}
:print-simple {:fn "true"}
:print-str {:fn "true"}
:print-tagged-object {:fn "true"}
:print-throwable {:fn "true"}
:printf {:fn "true"}
:println {:fn "true"}
:println-str {:fn "true"}
:prn {:fn "true"}
:prn-str {:fn "true"}
:process-annotation {:fn "true"}
:promise {:fn "true"}
:protected-final-methods {:fn "true"}
:protocol? {:fn "true"}
:proxy {:macro "true"}
:proxy-call-with-super {:fn "true"}
:proxy-mappings {:fn "true"}
:proxy-name {:fn "true"}
:proxy-super {:macro "true"}
:push-thread-bindings {:fn "true"}
:pvalues {:macro "true"}
:qualified-ident? {:fn "true"}
:qualified-keyword? {:fn "true"}
:qualified-symbol? {:fn "true"}
:quot {:fn "true"}
:rand {:fn "true"}
:rand-int {:fn "true"}
:rand-nth {:fn "true"}
:random-sample {:fn "true"}
:random-uuid {:fn "true"}
:range {:fn "true"}
:ratio? {:fn "true"}
:rational? {:fn "true"}
:rationalize {:fn "true"}
:re-find {:fn "true"}
:re-groups {:fn "true"}
:re-matcher {:fn "true"}
:re-matches {:fn "true"}
:re-pattern {:fn "true"}
:re-seq {:fn "true"}
:read {:fn "true"}
:read+string {:fn "true"}
:read-line {:fn "true"}
:read-string {:fn "true"}
:reader-conditional {:fn "true"}
:reader-conditional? {:fn "true"}
:realized? {:fn "true"}
:record? {:fn "true"}
:reduce {:fn "true"}
:reduce-kv {:fn "true"}
:reduce1 {:fn "true"}
:reduced {:fn "true"}
:reduced? {:fn "true"}
:reductions {:fn "true"}
:ref {:fn "true"}
:ref-history-count {:fn "true"}
:ref-max-history {:fn "true"}
:ref-min-history {:fn "true"}
:ref-set {:fn "true"}
:refer {:fn "true"}
:refer-clojure {:macro "true"}
:reify {:macro "true"}
:release-pending-sends {:fn "true"}
:rem {:fn "true"}
:remove {:fn "true"}
:remove-all-methods {:fn "true"}
:remove-method {:fn "true"}
:remove-ns {:fn "true"}
:remove-tap {:fn "true"}
:remove-watch {:fn "true"}
:repeat {:fn "true"}
:repeatedly {:fn "true"}
:replace {:fn "true"}
:replicate {:deprecated "\"1.3\"" :fn "true"}
:require {:fn "true"}
:requiring-resolve {:fn "true"}
:reset! {:fn "true"}
:reset-meta! {:fn "true"}
:reset-vals! {:fn "true"}
:resolve {:fn "true"}
:rest {:fn "true"}
:restart-agent {:fn "true"}
:resultset-seq {:fn "true"}
:reverse {:fn "true"}
:reversible? {:fn "true"}
:root-directory {:fn "true"}
:root-resource {:fn "true"}
:rseq {:fn "true"}
:rsubseq {:fn "true"}
:run! {:fn "true"}
:satisfies? {:fn "true"}
:second {:fn "true"}
:select-keys {:fn "true"}
:send {:fn "true"}
:send-off {:fn "true"}
:send-via {:fn "true"}
:seq {:fn "true"}
:seq-to-map-for-destructuring {:fn "true"}
:seq? {:fn "true"}
:seqable? {:fn "true"}
:seque {:fn "true"}
:sequence {:fn "true"}
:sequential? {:fn "true"}
:serialized-require {:fn "true"}
:set {:fn "true"}
:set-agent-send-executor! {:fn "true"}
:set-agent-send-off-executor! {:fn "true"}
:set-error-handler! {:fn "true"}
:set-error-mode! {:fn "true"}
:set-validator! {:fn "true"}
:set? {:fn "true"}
:setup-reference {:fn "true"}
:shift-mask {:fn "true"}
:short {:fn "true"}
:short-array {:fn "true"}
:shorts {:fn "true"}
:shuffle {:fn "true"}
:shutdown-agents {:fn "true"}
:sigs {:fn "true"}
:simple-ident? {:fn "true"}
:simple-keyword? {:fn "true"}
:simple-symbol? {:fn "true"}
:slurp {:fn "true"}
:some {:fn "true"}
:some-> {:macro "true"}
:some->> {:macro "true"}
:some-fn {:fn "true"}
:some? {:fn "true"}
:sort {:fn "true"}
:sort-by {:fn "true"}
:sorted-map {:fn "true"}
:sorted-map-by {:fn "true"}
:sorted-set {:fn "true"}
:sorted-set-by {:fn "true"}
:sorted? {:fn "true"}
:special-symbol? {:fn "true"}
:spit {:fn "true"}
:split-at {:fn "true"}
:split-with {:fn "true"}
:splitv-at {:fn "true"}
:spread {:fn "true"}
:str {:fn "true"}
:stream-into! {:fn "true"}
:stream-reduce! {:fn "true"}
:stream-seq! {:fn "true"}
:stream-transduce! {:fn "true"}
:string? {:fn "true"}
:strip-ns {:fn "true"}
:struct {:fn "true"}
:struct-map {:fn "true"}
:subs {:fn "true"}
:subseq {:fn "true"}
:subvec {:fn "true"}
:super-chain {:fn "true"}
:supers {:fn "true"}
:swap! {:fn "true"}
:swap-vals! {:fn "true"}
:symbol {:fn "true"}
:symbol? {:fn "true"}
:sync {:macro "true"}
:system-newline {}
:tagged-literal {:fn "true"}
:tagged-literal? {:fn "true"}
:take {:fn "true"}
:take-last {:fn "true"}
:take-nth {:fn "true"}
:take-while {:fn "true"}
:tap-loop {}
:tap> {:fn "true"}
:tapq {}
:tapset {}
:test {:fn "true"}
:the-array-class {:fn "true"}
:the-class {:fn "true"}
:the-ns {:fn "true"}
:thread-bound? {:fn "true"}
:throw-if {:fn "true"}
:time {:macro "true"}
:to-array {:fn "true"}
:to-array-2d {:fn "true"}
:trampoline {:fn "true"}
:transduce {:fn "true"}
:transient {:fn "true"}
:tree-seq {:fn "true"}
:true? {:fn "true"}
:type {:fn "true"}
:unchecked-add {:fn "true"}
:unchecked-add-int {:fn "true"}
:unchecked-byte {:fn "true"}
:unchecked-char {:fn "true"}
:unchecked-dec {:fn "true"}
:unchecked-dec-int {:fn "true"}
:unchecked-divide-int {:fn "true"}
:unchecked-double {:fn "true"}
:unchecked-float {:fn "true"}
:unchecked-inc {:fn "true"}
:unchecked-inc-int {:fn "true"}
:unchecked-int {:fn "true"}
:unchecked-long {:fn "true"}
:unchecked-multiply {:fn "true"}
:unchecked-multiply-int {:fn "true"}
:unchecked-negate {:fn "true"}
:unchecked-negate-int {:fn "true"}
:unchecked-remainder-int {:fn "true"}
:unchecked-short {:fn "true"}
:unchecked-subtract {:fn "true"}
:unchecked-subtract-int {:fn "true"}
:underive {:fn "true"}
:unquote {}
:unquote-splicing {}
:unreduced {:fn "true"}
:unsigned-bit-shift-right {:fn "true"}
:update {:fn "true"}
:update-in {:fn "true"}
:update-keys {:fn "true"}
:update-proxy {:fn "true"}
:update-vals {:fn "true"}
:uri? {:fn "true"}
:use {:fn "true"}
:uuid? {:fn "true"}
:val {:fn "true"}
:valid-java-method-name {:fn "true"}
:validate-fields {:fn "true"}
:validate-generate-class-options {:fn "true"}
:vals {:fn "true"}
:var-get {:fn "true"}
:var-set {:fn "true"}
:var? {:fn "true"}
:vary-meta {:fn "true"}
:vec {:fn "true"}
:vector {:fn "true"}
:vector-of {:fn "true"}
:vector? {:fn "true"}
:volatile! {:fn "true"}
:volatile? {:fn "true"}
:vreset! {:fn "true"}
:vswap! {:macro "true"}
:when {:macro "true"}
:when-class {:macro "true"}
:when-first {:macro "true"}
:when-let {:macro "true"}
:when-not {:macro "true"}
:when-some {:macro "true"}
:while {:macro "true"}
:with-bindings {:macro "true"}
:with-bindings* {:fn "true"}
:with-in-str {:macro "true"}
:with-loading-context {:macro "true"}
:with-local-vars {:macro "true"}
:with-meta {:fn "true"}
:with-open {:macro "true"}
:with-out-str {:macro "true"}
:with-precision {:macro "true"}
:with-redefs {:macro "true"}
:with-redefs-fn {:fn "true"}
:xml-seq {:fn "true"}
:zero? {:fn "true"}
:zipmap {:fn "true"}}}
:clojure.pprint
{:aliases
{}
:interns
{:*code-table* {}
:*current-length* {}
:*current-level* {}
:*default-page-width* {}
:*format-str* {}
:*print-base* {}
:*print-circle* {}
:*print-lines* {}
:*print-miser-width* {}
:*print-pprint-dispatch* {:fn "true"}
:*print-pretty* {}
:*print-radix* {}
:*print-right-margin* {}
:*print-shared* {}
:*print-suppress-namespaces* {}
:*symbol-map* {}
:abort? {:fn "true"}
:absolute-reposition {:fn "true"}
:absolute-tabulation {:fn "true"}
:add-core-ns {:fn "true"}
:add-english-scales {:fn "true"}
:add-to-buffer {:fn "true"}
:ancestor? {:fn "true"}
:arg-navigator {}
:base-str {:fn "true"}
:binding-map {:macro "true"}
:boolean-conditional {:fn "true"}
:brackets {:fn "true"}
:buffer-blob {}
:buffer-blob? {:fn "true"}
:buffer-length {:fn "true"}
:c-write-char {:fn "true"}
:cached-compile {:fn "true"}
:capitalize-string {:fn "true"}
:capitalize-word-writer {:fn "true"}
:check-arg-conditional {:fn "true"}
:check-enumerated-arg {:fn "true"}
:check-flags {:fn "true"}
:choice-conditional {:fn "true"}
:cl-format {:fn "true"}
:code-dispatch {:fn "true"}
:collect-clauses {:fn "true"}
:column-writer {:fn "true"}
:compile-directive {:fn "true"}
:compile-format {:fn "true"}
:compile-raw-string {:fn "true"}
:compiled-directive {}
:conditional-newline {:fn "true"}
:consume {:fn "true"}
:consume-while {:fn "true"}
:convert-ratio {:fn "true"}
:defdirectives {:macro "true"}
:deftype {:macro "true"}
:directive-table {}
:dollar-float {:fn "true"}
:downcase-writer {:fn "true"}
:else-separator? {:fn "true"}
:emit-nl {:fn "true"}
:emit-nl? {:fn "true"}
:end-block {:fn "true"}
:end-block-t {}
:end-block-t? {:fn "true"}
:english-cardinal-tens {}
:english-cardinal-units {}
:english-ordinal-tens {}
:english-ordinal-units {}
:english-scale-numbers {}
:execute-format {:fn "true"}
:execute-sub-format {:fn "true"}
:expand-fixed {:fn "true"}
:exponential-float {:fn "true"}
:extract-flags {:fn "true"}
:extract-param {:fn "true"}
:extract-params {:fn "true"}
:fixed-float {:fn "true"}
:flag-defs {}
:float-parts {:fn "true"}
:float-parts-base {:fn "true"}
:format-ascii {:fn "true"}
:format-cardinal-english {:fn "true"}
:format-error {:fn "true"}
:format-integer {:fn "true"}
:format-logical-block {:fn "true"}
:format-new-roman {:fn "true"}
:format-old-roman {:fn "true"}
:format-ordinal-english {:fn "true"}
:format-roman {:fn "true"}
:format-simple-cardinal {:fn "true"}
:format-simple-number {:fn "true"}
:format-simple-ordinal {:fn "true"}
:formatter {:macro "true"}
:formatter-out {:macro "true"}
:fresh-line {:fn "true"}
:general-float {:fn "true"}
:get-column {:fn "true"}
:get-field {:fn "true"}
:get-fixed {:fn "true"}
:get-format-arg {:fn "true"}
:get-line {:fn "true"}
:get-max-column {:fn "true"}
:get-miser-width {:fn "true"}
:get-pretty-writer {:fn "true"}
:get-section {:fn "true"}
:get-sub-section {:fn "true"}
:get-writer {:fn "true"}
:getf {:macro "true"}
:group-by* {:fn "true"}
:inc-s {:fn "true"}
:indent {:fn "true"}
:indent-t {}
:indent-t? {:fn "true"}
:init-cap-writer {:fn "true"}
:init-navigator {:fn "true"}
:insert-decimal {:fn "true"}
:insert-scaled-decimal {:fn "true"}
:integral? {:fn "true"}
:iterate-list-of-sublists {:fn "true"}
:iterate-main-list {:fn "true"}
:iterate-main-sublists {:fn "true"}
:iterate-sublist {:fn "true"}
:java-base-formats {}
:justify-clauses {:fn "true"}
:level-exceeded {:fn "true"}
:linear-nl? {:fn "true"}
:logical-block {}
:logical-block-or-justify {:fn "true"}
:ltrim {:fn "true"}
:make-buffer-blob {:fn "true"}
:make-end-block-t {:fn "true"}
:make-indent-t {:fn "true"}
:make-nl-t {:fn "true"}
:make-pretty-writer {:fn "true"}
:make-start-block-t {:fn "true"}
:map-params {:fn "true"}
:map-passing-context {:fn "true"}
:map-ref-type {:fn "true"}
:miser-nl? {:fn "true"}
:modify-case {:fn "true"}
:multi-defn {:fn "true"}
:needs-pretty {:fn "true"}
:new-roman-table {}
:next-arg {:fn "true"}
:next-arg-or-nil {:fn "true"}
:nl {:fn "true"}
:nl-t {}
:nl-t? {:fn "true"}
:old-roman-table {}
:opt-base-str {:fn "true"}
:orig-pr {:fn "true"}
:p-write-char {:fn "true"}
:param-pattern {}
:parse-lb-options {:fn "true"}
:plain-character {:fn "true"}
:pll-mod-body {:fn "true"}
:pp {:macro "true"}
:pp-newline {:fn "true"}
:pprint {:fn "true"}
:pprint-anon-func {:fn "true"}
:pprint-array {:fn "true"}
:pprint-binding-form {:fn "true"}
:pprint-code-list {:fn "true"}
:pprint-code-symbol {:fn "true"}
:pprint-cond {:fn "true"}
:pprint-condp {:fn "true"}
:pprint-defn {:fn "true"}
:pprint-hold-first {:fn "true"}
:pprint-ideref {:fn "true"}
:pprint-if {:fn "true"}
:pprint-indent {:fn "true"}
:pprint-let {:fn "true"}
:pprint-list {:fn "true"}
:pprint-logical-block {:macro "true"}
:pprint-map {:fn "true"}
:pprint-meta {:fn "true"}
:pprint-newline {:fn "true"}
:pprint-ns {:fn "true"}
:pprint-ns-reference {:fn "true"}
:pprint-pqueue {:fn "true"}
:pprint-reader-macro {:fn "true"}
:pprint-set {:fn "true"}
:pprint-simple-code-list {:fn "true"}
:pprint-simple-default {:fn "true"}
:pprint-simple-list {:fn "true"}
:pprint-tab {:fn "true"}
:pprint-vector {:fn "true"}
:pr-with-base {:fn "true"}
:prefix-count {:fn "true"}
:prerr {:fn "true"}
:pretty-character {:fn "true"}
:pretty-writer {:fn "true"}
:pretty-writer? {:fn "true"}
:print-length-loop {:macro "true"}
:print-table {:fn "true"}
:prlabel {:macro "true"}
:process-bracket {:fn "true"}
:process-clause {:fn "true"}
:process-directive-table-element {:fn "true"}
:process-nesting {:fn "true"}
:readable-character {:fn "true"}
:reader-macros {}
:realize-parameter {:fn "true"}
:realize-parameter-list {:fn "true"}
:relative-reposition {:fn "true"}
:relative-tabulation {:fn "true"}
:remainders {:fn "true"}
:render-clauses {:fn "true"}
:right-bracket {:fn "true"}
:round-str {:fn "true"}
:rtrim {:fn "true"}
:section {}
:separator? {:fn "true"}
:set-field {:fn "true"}
:set-indent {:fn "true"}
:set-logical-block-callback {:fn "true"}
:set-max-column {:fn "true"}
:set-miser-width {:fn "true"}
:set-pprint-dispatch {:fn "true"}
:setf {:macro "true"}
:simple-dispatch {:fn "true"}
:single-defn {:fn "true"}
:special-chars {}
:special-params {}
:special-radix-markers {}
:split-at-newline {:fn "true"}
:start-block {:fn "true"}
:start-block-t {}
:start-block-t? {:fn "true"}
:table-ize {:fn "true"}
:tok {:fn "true"}
:tokens-fit? {:fn "true"}
:toks {:fn "true"}
:translate-param {:fn "true"}
:tuple-map {:fn "true"}
:two-forms {:fn "true"}
:type-map {}
:unzip-map {:fn "true"}
:upcase-writer {:fn "true"}
:update-nl-state {:fn "true"}
:use-method {:fn "true"}
:walk {:fn "true"}
:with-pprint-dispatch {:macro "true"}
:with-pretty-writer {:macro "true"}
:write {:fn "true"}
:write-buffered-output {:fn "true"}
:write-initial-lines {:fn "true"}
:write-line {:fn "true"}
:write-option-table {}
:write-out {:fn "true"}
:write-to-base {:macro "true"}
:write-token {:fn "true"}
:write-token-string {:fn "true"}
:write-tokens {:fn "true"}
:write-white-space {:fn "true"}}}
:conjure.internal
{:aliases
{:pp "clojure.pprint"}
:interns
{:bounded-conj {:fn "true"}
:dump-tap-queue! {:fn "true"}
:enqueue-tap! {:fn "true"}
:initial-ns {}
:tap-queue! {}
:tap-queue-size {}}}
:user
{:aliases {} :interns {}}}
:id
"04ef028a-c5d2-44d8-bac8-00a5e6ab5e51"
:repl-type
"clj"
:session
"009bbab1-de19-4cd1-9872-7ce3b57e4566"
:status
["state"]}
Evaluate a fileλ︎
The cursor was moved to the ns form on line 36 of the 01-basics.clj file.
,+e+r to evaluate the ns for which gave the following output.
Output from first evaluation in a new repl session
; --------------------------------------------------------------------------------
; eval (root-form): (ns clojure-through-code.01-basics "Communicate th...
; debug: send
{:code
"(ns clojure-through-code.01-basics)"
:id
"131fa5a4-10ff-41a8-9a51-164ffba78b64"
:nrepl.middleware.print/options
{:associative 1 :length 500 :level 50 :right-margin 72}
:nrepl.middleware.print/print
"cider.nrepl.pprint/pprint"
:op
"eval"
:session
"44c3284a-41df-4f7e-a66d-bb30f484db91"}
; debug: send
{:code
"(ns clojure-through-code.01-basics
\"Communicate the purpose of a namespace via a doc-string.
Include descriptions of data models defined in the namespace.\")"
:column
1
:file
"/home/practicalli/projects/practicalli/clojure-through-code/src/clojure_through_code/01_basics.clj"
:id
"e468d5cd-445f-4580-aec5-ce944c4ef3b2"
:line
36
:nrepl.middleware.print/options
{:associative 1 :length 500 :level 50 :right-margin 72}
:nrepl.middleware.print/print
"cider.nrepl.pprint/pprint"
:ns
"clojure-through-code.01-basics"
:op
"eval"
:session
"44c3284a-41df-4f7e-a66d-bb30f484db91"}
; debug: receive
{:id "e468d5cd-445f-4580-aec5-ce944c4ef3b2"
:ns "clojure-through-code.01-basics"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["namespace-not-found" "done" "error"]}
; Namespace not found: clojure-through-code.01-basics
; debug: receive
{:changed-namespaces
{:clojure.pprint
{:aliases
{}
:interns
{:*code-table* {}
:*current-length* {}
:*current-level* {}
:*default-page-width* {}
:*format-str* {}
:*print-base* {}
:*print-circle* {}
:*print-lines* {}
:*print-miser-width* {}
:*print-pprint-dispatch* {:fn "true"}
:*print-pretty* {}
:*print-radix* {}
:*print-right-margin* {}
:*print-shared* {}
:*print-suppress-namespaces* {}
:*symbol-map* {}
:abort? {:fn "true"}
:absolute-reposition {:fn "true"}
:absolute-tabulation {:fn "true"}
:add-core-ns {:fn "true"}
:add-english-scales {:fn "true"}
:add-to-buffer {:fn "true"}
:ancestor? {:fn "true"}
:arg-navigator {}
:base-str {:fn "true"}
:binding-map {:macro "true"}
:boolean-conditional {:fn "true"}
:brackets {:fn "true"}
:buffer-blob {}
:buffer-blob? {:fn "true"}
:buffer-length {:fn "true"}
:c-write-char {:fn "true"}
:cached-compile {:fn "true"}
:capitalize-string {:fn "true"}
:capitalize-word-writer {:fn "true"}
:check-arg-conditional {:fn "true"}
:check-enumerated-arg {:fn "true"}
:check-flags {:fn "true"}
:choice-conditional {:fn "true"}
:cl-format {:fn "true"}
:code-dispatch {:fn "true"}
:collect-clauses {:fn "true"}
:column-writer {:fn "true"}
:compile-directive {:fn "true"}
:compile-format {:fn "true"}
:compile-raw-string {:fn "true"}
:compiled-directive {}
:conditional-newline {:fn "true"}
:consume {:fn "true"}
:consume-while {:fn "true"}
:convert-ratio {:fn "true"}
:defdirectives {:macro "true"}
:deftype {:macro "true"}
:directive-table {}
:dollar-float {:fn "true"}
:downcase-writer {:fn "true"}
:else-separator? {:fn "true"}
:emit-nl {:fn "true"}
:emit-nl? {:fn "true"}
:end-block {:fn "true"}
:end-block-t {}
:end-block-t? {:fn "true"}
:english-cardinal-tens {}
:english-cardinal-units {}
:english-ordinal-tens {}
:english-ordinal-units {}
:english-scale-numbers {}
:execute-format {:fn "true"}
:execute-sub-format {:fn "true"}
:expand-fixed {:fn "true"}
:exponential-float {:fn "true"}
:extract-flags {:fn "true"}
:extract-param {:fn "true"}
:extract-params {:fn "true"}
:fixed-float {:fn "true"}
:flag-defs {}
:float-parts {:fn "true"}
:float-parts-base {:fn "true"}
:format-ascii {:fn "true"}
:format-cardinal-english {:fn "true"}
:format-error {:fn "true"}
:format-integer {:fn "true"}
:format-logical-block {:fn "true"}
:format-new-roman {:fn "true"}
:format-old-roman {:fn "true"}
:format-ordinal-english {:fn "true"}
:format-roman {:fn "true"}
:format-simple-cardinal {:fn "true"}
:format-simple-number {:fn "true"}
:format-simple-ordinal {:fn "true"}
:formatter {:macro "true"}
:formatter-out {:macro "true"}
:fresh-line {:fn "true"}
:general-float {:fn "true"}
:get-column {:fn "true"}
:get-field {:fn "true"}
:get-fixed {:fn "true"}
:get-format-arg {:fn "true"}
:get-line {:fn "true"}
:get-max-column {:fn "true"}
:get-miser-width {:fn "true"}
:get-pretty-writer {:fn "true"}
:get-section {:fn "true"}
:get-sub-section {:fn "true"}
:get-writer {:fn "true"}
:getf {:macro "true"}
:group-by* {:fn "true"}
:inc-s {:fn "true"}
:indent {:fn "true"}
:indent-t {}
:indent-t? {:fn "true"}
:init-cap-writer {:fn "true"}
:init-navigator {:fn "true"}
:insert-decimal {:fn "true"}
:insert-scaled-decimal {:fn "true"}
:integral? {:fn "true"}
:iterate-list-of-sublists {:fn "true"}
:iterate-main-list {:fn "true"}
:iterate-main-sublists {:fn "true"}
:iterate-sublist {:fn "true"}
:java-base-formats {}
:justify-clauses {:fn "true"}
:level-exceeded {:fn "true"}
:linear-nl? {:fn "true"}
:logical-block {}
:logical-block-or-justify {:fn "true"}
:ltrim {:fn "true"}
:make-buffer-blob {:fn "true"}
:make-end-block-t {:fn "true"}
:make-indent-t {:fn "true"}
:make-nl-t {:fn "true"}
:make-pretty-writer {:fn "true"}
:make-start-block-t {:fn "true"}
:map-params {:fn "true"}
:map-passing-context {:fn "true"}
:map-ref-type {:fn "true"}
:miser-nl? {:fn "true"}
:modify-case {:fn "true"}
:multi-defn {:fn "true"}
:needs-pretty {:fn "true"}
:new-roman-table {}
:next-arg {:fn "true"}
:next-arg-or-nil {:fn "true"}
:nl {:fn "true"}
:nl-t {}
:nl-t? {:fn "true"}
:old-roman-table {}
:opt-base-str {:fn "true"}
:orig-pr {:fn "true"}
:p-write-char {:fn "true"}
:param-pattern {}
:parse-lb-options {:fn "true"}
:plain-character {:fn "true"}
:pll-mod-body {:fn "true"}
:pp {:macro "true"}
:pp-newline {:fn "true"}
:pprint {:fn "true"}
:pprint-anon-func {:fn "true"}
:pprint-array {:fn "true"}
:pprint-binding-form {:fn "true"}
:pprint-code-list {:fn "true"}
:pprint-code-symbol {:fn "true"}
:pprint-cond {:fn "true"}
:pprint-condp {:fn "true"}
:pprint-defn {:fn "true"}
:pprint-hold-first {:fn "true"}
:pprint-ideref {:fn "true"}
:pprint-if {:fn "true"}
:pprint-indent {:fn "true"}
:pprint-let {:fn "true"}
:pprint-list {:fn "true"}
:pprint-logical-block {:macro "true"}
:pprint-map {:fn "true"}
:pprint-meta {:fn "true"}
:pprint-newline {:fn "true"}
:pprint-ns {:fn "true"}
:pprint-ns-reference {:fn "true"}
:pprint-pqueue {:fn "true"}
:pprint-reader-macro {:fn "true"}
:pprint-set {:fn "true"}
:pprint-simple-code-list {:fn "true"}
:pprint-simple-default {:fn "true"}
:pprint-simple-list {:fn "true"}
:pprint-tab {:fn "true"}
:pprint-vector {:fn "true"}
:pr-with-base {:fn "true"}
:prefix-count {:fn "true"}
:prerr {:fn "true"}
:pretty-character {:fn "true"}
:pretty-writer {:fn "true"}
:pretty-writer? {:fn "true"}
:print-length-loop {:macro "true"}
:print-table {:fn "true"}
:prlabel {:macro "true"}
:process-bracket {:fn "true"}
:process-clause {:fn "true"}
:process-directive-table-element {:fn "true"}
:process-nesting {:fn "true"}
:readable-character {:fn "true"}
:reader-macros {}
:realize-parameter {:fn "true"}
:realize-parameter-list {:fn "true"}
:relative-reposition {:fn "true"}
:relative-tabulation {:fn "true"}
:remainders {:fn "true"}
:render-clauses {:fn "true"}
:right-bracket {:fn "true"}
:round-str {:fn "true"}
:rtrim {:fn "true"}
:section {}
:separator? {:fn "true"}
:set-field {:fn "true"}
:set-indent {:fn "true"}
:set-logical-block-callback {:fn "true"}
:set-max-column {:fn "true"}
:set-miser-width {:fn "true"}
:set-pprint-dispatch {:fn "true"}
:setf {:macro "true"}
:simple-dispatch {:fn "true"}
:single-defn {:fn "true"}
:special-chars {}
:special-params {}
:special-radix-markers {}
:split-at-newline {:fn "true"}
:start-block {:fn "true"}
:start-block-t {}
:start-block-t? {:fn "true"}
:table-ize {:fn "true"}
:tok {:fn "true"}
:tokens-fit? {:fn "true"}
:toks {:fn "true"}
:translate-param {:fn "true"}
:tuple-map {:fn "true"}
:two-forms {:fn "true"}
:type-map {}
:unzip-map {:fn "true"}
:upcase-writer {:fn "true"}
:update-nl-state {:fn "true"}
:use-method {:fn "true"}
:walk {:fn "true"}
:with-pprint-dispatch {:macro "true"}
:with-pretty-writer {:macro "true"}
:write {:fn "true"}
:write-buffered-output {:fn "true"}
:write-initial-lines {:fn "true"}
:write-line {:fn "true"}
:write-option-table {}
:write-out {:fn "true"}
:write-to-base {:macro "true"}
:write-token {:fn "true"}
:write-token-string {:fn "true"}
:write-tokens {:fn "true"}
:write-white-space {:fn "true"}}}
:conjure.internal
{:aliases
{:pp "clojure.pprint"}
:interns
{:bounded-conj {:fn "true"}
:dump-tap-queue! {:fn "true"}
:enqueue-tap! {:fn "true"}
:initial-ns {}
:tap-queue! {}
:tap-queue-size {}}}}
:id
"e468d5cd-445f-4580-aec5-ce944c4ef3b2"
:repl-type
"clj"
:session
"44c3284a-41df-4f7e-a66d-bb30f484db91"
:status
["state"]}
; debug: receive
{:id "131fa5a4-10ff-41a8-9a51-164ffba78b64"
:ns "clojure-through-code.01-basics"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:value "nil"}
; debug: receive
{:id "131fa5a4-10ff-41a8-9a51-164ffba78b64"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["done"]}
; debug: receive
{:changed-namespaces {:clojure-through-code.01-basics {:aliases {} :interns {}}}
:id "131fa5a4-10ff-41a8-9a51-164ffba78b64"
:repl-type "clj"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["state"]}
Debug output from evaluating ns form a second time
; --------------------------------------------------------------------------------
; eval (root-form): (ns clojure-through-code.01-basics "Communicate th...
; debug: send
{:code
"(ns clojure-through-code.01-basics
\"Communicate the purpose of a namespace via a doc-string.
Include descriptions of data models defined in the namespace.\")"
:column
1
:file
"/home/practicalli/projects/practicalli/clojure-through-code/src/clojure_through_code/01_basics.clj"
:id
"2ce9b0a7-7733-4974-b5aa-4fd1d1a2e039"
:line
36
:nrepl.middleware.print/options
{:associative 1 :length 500 :level 50 :right-margin 72}
:nrepl.middleware.print/print
"cider.nrepl.pprint/pprint"
:ns
"clojure-through-code.01-basics"
:op
"eval"
:session
"44c3284a-41df-4f7e-a66d-bb30f484db91"}
; debug: receive
{:id "2ce9b0a7-7733-4974-b5aa-4fd1d1a2e039"
:ns "clojure-through-code.01-basics"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:value "nil"}
nil
; debug: receive
{:id "2ce9b0a7-7733-4974-b5aa-4fd1d1a2e039"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["done"]}
; debug: receive
{:changed-namespaces {}
:id "2ce9b0a7-7733-4974-b5aa-4fd1d1a2e039"
:repl-type "clj"
:session "44c3284a-41df-4f7e-a66d-bb30f484db91"
:status ["state"]}
Neovimλ︎
Whist creating the journal entry for Conjure debugging there was an increase in system resource use by Neovim. This was caused by the Alex LSP tool which continually parses the text for offensive words.
++spc+"p"+"m" to open the Mason manager in Neovim. X with the cursor on the Alex name to remove the pluging. I could have also used :LspStop but assumed this would stop marksman tool too (which doesnt cause an error).
Neovim Mason plugins updated 2026-02-10
Installed
✓ codelldb
✓ marksman
✓ selene
✓ kulala-fmt
✓ markdownlint
✓ gh-actions-language-server
✓ lua-language-server lua_ls
✓ gh
Zensicalλ︎
I am enjoying using Zensical (a from the ground rewrite of MkDocs and Material for MkDocs) which is currently used for all the practicalli books.
The Zensical docs include install instructions with the standard pip package manager and uv which is a rust language implementation that seems much faster (in my own experience).
The uv instructions seem to focus on Zensical as part of a Python project, which requires a pyproject.toml configuration file and recommends a Python Virtual Environmet.
uv can install packages as a tool, by placing an executable file in ~/.local/bin. This greatly simplifies the command and removes the need for a Python Virtual Environment, a pyproject.toml and uv.lock file.
UV tool Installλ︎
Output of Zensical tool install
uv tool command installs binaries in ~/.local/bin/ so this command only needs to run once.
Add Cargo bin to pathλ︎
If ~/.local/bin/ is not already on the execution PATH, then uv shows a warning and the zensical command will not be recognised (without the full path to the file).
warning: `/home/practicalli/.local/share/../bin` is not on your PATH. To use installed tools, run `export PATH="/home/practicalli/.local/share/../bin:$PATH"` or `uv tool update-shell`.
For bash, edit the ~/.bashrc file and add the following
Add local/bin to execution path for bash shell
NOTE: Ideally the export would be wrapped in an
ifexpression that tests for the existance of the~/.local/bindirectory.
For Zsh, edit the zshenv file and add ~/.cargo/bin directory to the execution path if that directory exists
Add Cargo bin director to path - Zsh
The uv tool install can be passed additional arguments, for example a tool can be upgraded by appending the --upgrade option.
Makefile tasks for Zensicalλ︎
Practicalli uses a Makefile to define tasks to provide a consistent command line interface across all projects, as well as simplifying those commands.
docs-install uses the uv tool approach to install or upgrade zensical. This approach removes the need to have separate tasks for install and upgrade.
# --- Documentation Generation ------------------ #
docs-install: ## Install or upgrade Zensical in Python virtual environment
uv tool install zensical --upgrade
docs: ## Build and run docs in local server
$(info -- Local Server --------------------------)
$(DOCS_SERVER)
docs-open: ## Build docs, run server & open browser
$(info -- Local Server & Browser ----------------)
$(DOCS_SERVER) --open
docs-build: ## Build docs locally
$(info -- Build Docs Website --------------------)
zensical build
docs-debug: ## Run local server in debug mode
$(info -- Local Server Debug --------------------)
$(DOCS_SERVER) -v
# ------------------------------------------------ #
Material for MkDocsλ︎
As I am using Zensical as a tool (uv rather than pip), can I apply the same approach to Material for MkDocs to avoid having two different setups for books?
NOTE: I cannot convert all books as Zensical does not support blogs yet (and may not until later in the year).
Install mkdocs-materail as a toolλ︎
I tried to install mkdocs-material as a tool, but it reports that the mkdocs-material does not contain an executable.
NOTE: I assume the Pip package pulls in mkdocs executable some how, but the same doesnt seem to work for
uv.
mkdocs-material does not include an executable - install failed
❯ uv tool install mkdocs-material
Resolved 29 packages in 480ms
Prepared 29 packages in 4.82s
Installed 29 packages in 322ms
+ babel==2.18.0
+ backrefs==6.1
+ certifi==2026.1.4
+ charset-normalizer==3.4.4
+ click==8.3.1
+ colorama==0.4.6
+ ghp-import==2.1.0
+ idna==3.11
+ jinja2==3.1.6
+ markdown==3.10.2
+ markupsafe==3.0.3
+ mergedeep==1.3.4
+ mkdocs==1.6.1
+ mkdocs-get-deps==0.2.0
+ mkdocs-material==9.7.1
+ mkdocs-material-extensions==1.3.1
+ packaging==26.0
+ paginate==0.5.7
+ pathspec==1.0.4
+ platformdirs==4.9.1
+ pygments==2.19.2
+ pymdown-extensions==10.20.1
+ python-dateutil==2.9.0.post0
+ pyyaml==6.0.3
+ pyyaml-env-tag==1.1
+ requests==2.32.5
+ six==1.17.0
+ urllib3==2.6.3
+ watchdog==6.0.0
No executables are provided by package `mkdocs-material`; removing tool
error: Failed to install entrypoints for `mkdocs-material`
Tools with other pluginsλ︎
Installing the mkdocs package as a tool works, so using the --with option I can add dependencies such as mkdocs-material and other plugins I used to build the Practicalli websites.
The --with option needs to be used for each extra plugin required, which does make the command a little long.
This approach does install mkdocs as a binary and builds an existing Practicalli website without issue.
uv tool install of mkdocs with material plugins
Successful MkDocs install with Material plugins
❯ uv tool install --with mkdocs-material --with mkdocs-callouts --with mkdocs-glightbox --with mkdocs-git-revision-date-localized-plugin --with mkdocs-redirects --with mkdocs-rss-plugin --with pillow --with cairosvg mkdocs
Resolved 50 packages in 650ms
Prepared 21 packages in 685ms
Installed 21 packages in 17ms
+ cachecontrol==0.14.4
+ cairocffi==1.7.1
+ cairosvg==2.8.2
+ cffi==2.0.0
+ cssselect2==0.9.0
+ defusedxml==0.7.1
+ filelock==3.24.0
+ gitdb==4.0.12
+ gitpython==3.1.46
+ mkdocs-callouts==1.16.0
+ mkdocs-git-revision-date-localized-plugin==1.5.1
+ mkdocs-glightbox==0.5.2
+ mkdocs-redirects==1.2.2
+ mkdocs-rss-plugin==1.17.9
+ msgpack==1.1.2
+ pillow==12.1.1
+ pycparser==3.0
+ selectolax==0.4.6
+ smmap==5.0.2
+ tinycss2==1.5.1
+ webencodings==0.5.1
Installed 1 executable: mkdocs
Makefile task for uv tool installλ︎
To avoid typing in the very long commands, a collection of Makefile task were created for document generation.
Moving away from a pip and venv virtual environment to a uv tool install approach, the tasks have been greatly simplified.
The python-venv task is no longer required as there is no need for a virtual environment.
The call to activate the Python virtual environment was removed from the start of each task, as the tool is available to the user without a virtual environment.
Updated Makefile using uv tool install approach
# --- Documentation Generation -------- #
mkdocs-uv-install:
uv tool install --with mkdocs-material --with mkdocs-callouts --with mkdocs-glightbox --with mkdocs-git-revision-date-localized-plugin --with mkdocs-redirects --with mkdocs-rss-plugin --with pillow --with cairosvg mkdocs
docs: ## Build and run mkdocs in local server
$(info -- MkDocs Local Server -------------------)
$(MKDOCS_SERVER)
docs-changed: ## Build only changed files and run mkdocs in local server (python venv)
$(info -- Mkdocs Local Server -------------------)
$(MKDOCS_SERVER) --dirtyreload
docs-build: ## Build mkdocs (python venv)
$(info -- Mkdocs Build Website ------------------)
mkdocs build
docs-debug: ## Run mkdocs local server in debug mode
$(info -- Mkdocs Local Server Debug -------------)
$(MKDOCS_SERVER) -v
# -------------------------------------- #
Debian Linux post install scriptλ︎
Install Material for MkDocs and Zensical via a script after installing a new Debian Linux OS.
Practicalli dotfiles contains post install scripts for setting up an effective set of development tools quickly and easily.
The uv tools install script is currently called uv-tools-install.sh which should be run as the user account. If run as root user (via su - or sudo the tools will only be accessible to the root account).
Uv tools install script for MkDocs & Zensical
echo "# ---------------------------------------"
echo "Install Material for MkDocs as tool with supporting plugins"
uv tool install --with mkdocs-material --with mkdocs-callouts --with mkdocs-glightbox --with mkdocs-git-revision-date-localized-plugin --with mkdocs-redirects --with mkdocs-rss-plugin --with pillow --with cairosvg mkdocs
echo "# ---------------------------------------"
echo ""
echo "# ---------------------------------------"
echo "Install Zensical - updates if already installed"
uv tool install zensical --upgrade
echo "# ---------------------------------------"
Output of tools script - one tool already installed
./uv-tools-install.sh
# ---------------------------------------
Install Material for MkDocs as tool with supporting plugins
`mkdocs` is already installed
# ---------------------------------------
# ---------------------------------------
Install Zensical - updates if already installed
Resolved 7 packages in 340ms
Prepared 7 packages in 3.58s
Installed 7 packages in 346ms
+ click==8.3.1
+ deepmerge==2.0
+ markdown==3.10.2
+ pygments==2.19.2
+ pymdown-extensions==10.20.1
+ pyyaml==6.0.3
+ zensical==0.0.23
Installed 1 executable: zensical
# ---------------------------------------
TUIsλ︎
Most TUIs I have found are written in Rust and publish pre-compiled binaries via GitHub releases.
Using a pre-compiled binary saves a lot of time installing a tui app. I also use DRA to script the install of TUI apps I commonly use.
Where a project does not provide a pre-compiled binary, then its necessary to download the source code and compile locally.
cargo is the tool for managing Rust Language versions, calling the rust compiler and downloading 'crates' (Rust packages/libraries) from the internet.
Install Cargo on Debian Linuxλ︎
Debian has a cargo .deb package, although it is not the latest stable version and should not be used (Debian Stable as of 13 February 2026).
The recommended approach by the Debian Rust team is to install rustup and use that tool to download the latest stable rust compiler and cargo tooling.
Output of install rustup
❯ sudo apt install rustup
Installing:
rustup
Summary:
Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 38
Download size: 2,158 kB
Space needed: 7,078 kB / 4,425 MB available
Get:1 http://deb.debian.org/debian trixie/main amd64 rustup amd64 1.27.1-3+b1 [2,158 kB]
Fetched 2,158 kB in 0s (8,546 kB/s)
Selecting previously unselected package rustup.
(Reading database ... 233922 files and directories currently installed.)
Preparing to unpack .../rustup_1.27.1-3+b1_amd64.deb ...
Unpacking rustup (1.27.1-3+b1) ...
Setting up rustup (1.27.1-3+b1) ...
Output of rustup default stable command
❯ rustup default stable
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2026-02-12, rust version 1.93.1 (01f6ddf75 2026-02-11)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
20.7 MiB / 20.7 MiB (100 %) 16.5 MiB/s in 1s ETA: 0s
info: downloading component 'rust-std'
28.1 MiB / 28.1 MiB (100 %) 16.3 MiB/s in 1s ETA: 0s
info: downloading component 'rustc'
74.4 MiB / 74.4 MiB (100 %) 16.4 MiB/s in 4s ETA: 0s
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
20.7 MiB / 20.7 MiB (100 %) 12.3 MiB/s in 1s ETA: 0s
info: installing component 'rust-std'
28.1 MiB / 28.1 MiB (100 %) 26.2 MiB/s in 1s ETA: 0s
info: installing component 'rustc'
74.4 MiB / 74.4 MiB (100 %) 26.9 MiB/s in 2s ETA: 0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'
stable-x86_64-unknown-linux-gnu installed - rustc 1.93.1 (01f6ddf75 2026-02-11)
Installing Debian Linux Cargo package not recommended
The version of cargo and rust compiler in Debian Linux packages is currently v1.85.0. Use the rustup debian package to install the latest stable rust tools.
❯ sudo apt install cargo in 10s261ms 12:48 practicalli
[sudo] password for practicalli:
Installing:
cargo
Installing dependencies:
clang-19 lib32stdc++6 libclang-cpp19 libhttp-parser2.9 libpfm4 libxml2-dev llvm-19 llvm-19-runtime python3-yaml
clang-tools-19 libc6-i386 libclang-rt-19-dev libobjc-14-dev libstd-rust-1.85 libz3-dev llvm-19-dev llvm-19-tools rust-llvm
lib32gcc-s1 libclang-common-19-dev libgit2-1.9 libobjc4 libstd-rust-dev lld-19 llvm-19-linker-tools python3-pygments rustc
Suggested packages:
cargo-doc clang-19-doc wasi-libc llvm-19-doc python-pygments-doc
Summary:
Upgrading: 0, Installing: 28, Removing: 0, Not Upgrading: 38
Download size: 167 MB
Space needed: 966 MB / 4,303 MB available
Compiling locallyλ︎
The YouTui project does not publish pre-compiled binaries. The source code requires rustc 1.91 or newer to compile.
Download the source code, either from the release or by cloning the repository (shallow clone, as the history is not required)
Output of shallow clone
❯ git clone --depth=1 https://github.com/nick42d/youtui.git
Cloning into 'youtui'...
remote: Enumerating objects: 361, done.
remote: Counting objects: 100% (361/361), done.
remote: Compressing objects: 100% (261/261), done.
remote: Total 361 (delta 134), reused 197 (delta 85), pack-reused 0 (from 0)
Receiving objects: 100% (361/361), 3.87 MiB | 5.43 MiB/s, done.
Resolving deltas: 100% (134/134), done.
Compile the source code and generate a binary file, saved to ~/.cargo/bin
Compile youtui and install the resulting binary
Compile time was ~ 4 minutes and 30 seconds on an AMD Ryzen™ 7 PRO 4750U.
NOTE: see add cargo bin to path if
~/.cargo/bindirectory is not on the execution path already.
Configure YouTUIλ︎
By default YouTUI uses browser authentication, so the cookie from a POST request to music.youtube.com must be copies to the ~/.config/youtui/cookie.txt file. The Cookie value was copies from the Firefox developer tools (F12) > Network tab > Select a POST request > Resource Headers > Cookie
Now I can search for music in YouTUI, but the music will not play (403 forbidden errors).
Copy the examples/config/config.toml file from the YouTui GitHub repository into ~/.config/youtui/config.toml. Edit this config file and use yt-dlp as the download tool (installing yt-dlp if not already available).
YouTUI config file excerpt
Thank you.