Giter Club home page Giter Club logo

fipp's Introduction

Fast Idiomatic Pretty-Printer

Fipp is a better pretty printer for Clojure and ClojureScript.

Like clojure.pprint, this pretty printer has a linear runtime and uses bounded space. However, unlike clojure.pprint, Fipp's implementation is tuned for great performance and has a functional, data-driven API.

The data interface is agnostic to the source language. Printers are included for Edn data and Clojure code, but it is easy to create a pretty printer for your own language or documents: Even if they're not made out of Clojure data!

Fipp is great for printing large data files and debugging macros, but it is not suitable as a code reformatting tool. (explanation)

Installation

Fipp artifacts are published on Clojars.

To depend on this version with Lein, add the following to your project.clj:

[fipp "0.6.26"]

This version of Fipp works with Clojure 1.7 or newer.

See the v0.5 branch for a version of Fipp that works with Clojure 1.6.

ClojureScript is supported from build 3269 and up.

Colorization & REPL Integration

Puget uses Fipp's engine to provide an alternative, colorizing printer.

Whidbey integrates Puget in to nREPL via Leiningen, so that every evaluation pretty prints in color.

Printer Usage

;; Refer with a rename to avoid collision with your REPL's pprint.
(require '[fipp.edn :refer [pprint] :rename {pprint fipp}])

(fipp [1 2 3])
(fipp (range 50))
(fipp (range 20))
(fipp (range 20) {:width 10})

(require '[fipp.clojure])
(fipp.clojure/pprint '(let [foo "abc 123"
                            bar {:x 1 :y 2 :z 3}]
                        (do-stuff foo (assoc bar :w 4)))
                    {:width 40})

The available options are:

  • :width defaults to 70.
  • :writer defaults to clojure.core/*out* (Clojure only).
  • :print-fn defaults to cljs.core/*print-fn* (ClojureScript only).
  • :print-length behaves as and defaults to clojure.core/*print-length*.
  • :print-level behaves as and defaults to clojure.core/*print-level*.
  • :print-meta behaves as and defaults to clojure.core/*print-meta*.

Any other supported/hidden options are subject to change.

Conveniences

The dbg macro can be used for convenient "printf debugging" of source file, line, expression, and evaluation result to *err*.

(require '[fipp.edn :refer [dbg]])
(dbg (repeat 5 (range 10)))

This will print:

/path/to/that/file.clj:2
(repeat 5 (range 10))
=>
((0 1 2 3 4 5 6 7 8 9)
 (0 1 2 3 4 5 6 7 8 9)
 (0 1 2 3 4 5 6 7 8 9)
 (0 1 2 3 4 5 6 7 8 9)
 (0 1 2 3 4 5 6 7 8 9))

A Fipp-enabled version of clojure.repl/pst is also available:

user=> (require '[fipp.repl :refer [pst]])
user=> (throw (ex-info "whoops" {:xs (range 20) :ys (range 20)}))

ExceptionInfo whoops  clojure.core/ex-info (core.clj:4617)
user=> (fipp.repl/pst)
ExceptionInfo whoops
{:xs (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19),
 :ys (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)}
      clojure.core/ex-info (core.clj:4617)
      clojure.core/ex-info (core.clj:4617)
      user/eval3185 (form-init1248204588518004004.clj:1)
      user/eval3185 (form-init1248204588518004004.clj:1)
      clojure.lang.Compiler.eval (Compiler.java:6927)
      clojure.lang.Compiler.eval (Compiler.java:6890)
      clojure.core/eval (core.clj:3105)
      clojure.core/eval (core.clj:3101)
      clojure.main/repl/read-eval-print--7408/fn--7411 (main.clj:240)
      clojure.main/repl/read-eval-print--7408 (main.clj:240)
      clojure.main/repl/fn--7417 (main.clj:258)
      clojure.main/repl (main.clj:258)

Fast!

In my non-scientific testing, it has proven to be at least five times as fast as clojure.pprint. It also has the nice property of printing no later than having consumed the bounded amount of memory, so you see your first few lines of output instantaneously.

The core algorithm is described by Swierstra and Chitil in Linear, Bounded, Functional Pretty-Printing.

Swierstra and Chitil's implementation uses lazy evaluation and requires tying the knot to interleave the measuring and printing phases to achieve the bounded space goal.

However, this implementation is instead a port of the strict evaluation strategy as described by Kiselyov, Peyton-Jones, and Sabry in Lazy v. Yield: Incremental, Linear Pretty-printing.

Clojure's transducers are used to simulate generators and their yield operator. Unlike lazy reduction, transducers interleave execution of multi-phase transformations by function composition. This enables preservation of the bounded-space requirement and eases reasoning about the program's behavior. Additionally, it avoids a lot of intermediate object allocation.

Idiomatic!

Clojure's included pretty printer supports pluggable dispatch tables and provides an API for controlling the printing process. The programming model is side-effectual. For example, to print a breaking newline, you execute (pprint-newline :linear). This means that it's a difficult and tricky process to write or compose new pretty printers.

Fipp, on the other hand, accepts a "pretty print document" as input. This document is similar to HTML markup using hiccup.

Here are some examples:

(require '[fipp.engine :refer (pprint-document)])

(defn ppd [doc]
  (pprint-document doc {:width 10}))

(ppd [:span "One" :line "Two" :line "Three"])

(ppd [:group "(do" [:nest 2 :line "(step-1)" :line "(step-2)"] ")"])

If you want to write your own printer, see doc/primitives.md for details.

License

Copyright © 2015-2021 Brandon Bloom

Distributed under the Eclipse Public License, the same as Clojure.

Acknowledgements

Fipp is fast in part thanks to YourKit's Java Profiler.

fipp's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fipp's Issues

fipp won't compile with cljsbuild projects

The issue is easy to replicate. Just create a new project.clj

(defproject test-fipp "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.227"]
                 [fipp "0.6.6"]]
  :plugins [[lein-cljsbuild "1.1.4"]]
  :cljsbuild {:builds [{:id "js"
                        :source-paths ["src"]
                        :compiler {:output-to "target/test.js"
                                   :output-dir "target/js"
                                   :optimizations :advanced}}]})

and put a dummy cljc file in src/test_fipp/core.cljc:

(ns test-fipp.core
  (:require [fipp.engine :as engine]))

(defn foo
  [x]
  (println x "Hello, World!"))

now try to compile it with:

lein cljsbuild once

and you'll get an exception that starts like this:

clojure.lang.ExceptionInfo: failed compiling
file:target/js/clojure/core/rrb_vector/trees.cljs {:file #object[java.io.File 0x6a65daed
"target/js/clojure/core/rrb_vector/trees.cljs"]}
        at clojure.core$ex_info.invokeStatic(core.clj:4617)
        at clojure.core$ex_info.invoke(core.clj:4617)
        at
        cljs.compiler$compile_file$fn__3553.invoke(compiler.cljc:1386)

i think the problem might be in the rrb library, but seeing most of
the bugs reports in its jira have been unattended for more than a
year, i've opted for avoiding rrb in the deque namespace for the time
being :).

Not quite stylish formatting of named arguments.

Fipp, as well as pprint, doesn't seem to render named arguments correctly:

(foo :param1 "What a sunny day this is!"
     :param2 "Wait, which day is it again?"
     :param3 364)

Would be rendered as:

(foo
  :param1
  "What a sunny day this is!"
  :param2
  "Wait, which day is it again?"
  :param3
  364

I consider this an issue because there are well-known rules for formatting them.

Root pretty document must be a group.

If it's not a group, then no :begin operation will occur, and therefore fits will start at zero, causing all :line ops to be rendered as newlines.

Width consider trailing delimiters

Consider this data structure which has trailing ] delimiters:

[[[[[(0 1 2 3 4 5 6 7 8 9)]]]]]
1234567890123456789012345678901

(below it is a 1-based column indication for reference).

FIPP will switch to printing this with the numbers aligned vertically at :width threshold of 25 (in other words, at the right-most 9).

An improvement would be to have it instead switch when all the trailing ] characters can no longer fit (say, when width is 30).

A consequence of the current behavior is if the terminal is of width 26 and you are using :width to inform when wrapping should occur, you get output that looks like this:

[[[[[(0 1 2 3 4 5 6 7 8 9)
]]]]]

where the wrapping of the trailing ] characters is essentially being done by the terminal.

If FIPP is working as designed (or perhaps it can't handle this case while preserving its perf guarantees), feel free to close as "won't-fix"; just capturing it here is case it was an oversight.

Add a version of fipp that prints to string

It'd be really useful if there was one such function that people can directly use as the print function of nREPL or its clients. Currently cider-nrepl has to have a dependency on fipp just to tweak it's api a bit. See https://github.com/clojure-emacs/cider-nrepl/blob/master/src/cider/nrepl/pprint.clj#L29

nREPL's print contract is here https://nrepl.org/nrepl/design/middleware.html#_pretty_printing Basically a function that takes an object and map of print options and returns a string.

zprint, puget and pprint (to some degree) already have such functions, so it'd be nice if fipp had one as well.

P.S. You can ignore the part about keywordizing of keys. When we've added pprint support to nREPL I didn't remember that keywords can't be encoded with bencode.

I think there is a subtle nest/align bug

See comment on annotate-begins in printer.clj. Haven't seen it be a problem in real usage yet, but I suspect I'm slightly incorrectly classifying some nested forms as fitting or non-fitting. Need to investigate.

Some map-like objects are printed incorrectly

See clojure-emacs/cider#1505.
At least one example are datomic entities one gets by doing something like

(datomic.api/entity db [:db/ident :some/attr])

Normally they would print like this:

{:db/id 96}

With fipp they are printed like this:

#object[datomic.query.EntityMap "0x5123dcf1" "{:db/id 96}"]

BigDecimal Handling

Hi there,

Thanks for this great library! I'm finding that BigDecimals don't survive a print/read cycle:

(require '[fipp.edn :as fipp])

(fipp/pprint 0.25M)
; 0.25
;=> nil

(prn 0.25M)
; 0.25M
;=> nil

a strange case in generating regex with slashes, related to ClojureScript

I had some code generated with fipp, there was a regular expression:

#"\w+\/\w+"

which later generated js code, but I got an error running the regex:

clojure.string.replace(k,/\w+\\/\w+/,"~/")
//                             ^ this slash causes error
=>> node
Welcome to Node.js v14.7.0.
Type ".help" for more information.
> /\w+\\/\w+/
/\w+\\/\w+/
^

Uncaught SyntaxError: Invalid regular expression flags
>

I looked into my own code and tried. Turn out I have expression:

[["println" "#\"\\w+/\\w+"]]

which used a regex like this:

(println #"\w+\/\w+")

it turned out to be a valid Clojure regex, no matter if I use \/ or /:

user=> (re-matches #"\w+\/\w+" "a/a")
;                       ^^
"a/a"
user=> (re-matches #"\w+/\w+" "a/a")
;                       ^
"a/a"

However it brings syntax error in generated js. I'm not sure whether this is a fipp issue of a ClojureScript issue? Will FIPP handle this for ClojureScript?

clojurescript tests failing

Hiya!

While preparing to work on #66, I wanted to make sure all tests pass first.

So I ran what seemed to make sense:

  1. clojure tests - lein test
  2. benchmark - lein run -m fipp.benchmark
  3. clojurescript tests - ./test.sh

The first 2 succeeded but the clojurescript tests showed 4 failures:

FAIL in (pprint-edn) (cljs/test.js:431:14)
Pretty printing Edn without metadata
expected: (= (clean (with-out-str (pprint data {:width 70}))) wide)
  actual: (not (= "[(1 2 3 4 [:a :b :c :d] 5 6 7 8 9)\n {:foo 1, :bar \"c\", :baz \"str\"}\n {:small-value [1 2 3],\n  :larger-value {:some-key \"foo\", :some-other-key \"bar\"}}\n #fipp.edn_test.Person{:first-name \"Brandon\", :last-name \"Bloom\"}\n #x 5\n #object[clojure.core.Atom\n         {:status :ready,\n          :val (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)}]\n #object[clojure.core$future_call$reify__123\n         \"0xDEADBEEF\"\n         {:status :ready, :val 1}]\n #{:baz :bar :foo}]" "[(1 2 3 4 [:a :b :c :d] 5 6 7 8 9)\n {:foo 1, :bar \\c, :baz \"str\"}\n {:small-value [1 2 3],\n  :larger-value {:some-key \"foo\", :some-other-key \"bar\"}}\n #fipp.edn_test.Person{:first-name \"Brandon\", :last-name \"Bloom\"}\n #x 5\n #object[clojure.lang.Atom\n         \"0xDEADBEEF\"\n         {:status :ready,\n          :val (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)}]\n #object[clojure.core$future_call$reify__123\n         \"0xDEADBEEF\"\n         {:status :ready, :val 1}]\n #{:baz :bar :foo}]"))

FAIL in (pprint-edn) (cljs/test.js:431:14)
Pretty printing Edn without metadata
expected: (= (clean (with-out-str (pprint data {:width 30}))) narrow)
  actual: (not (= "[(1\n  2\n  3\n  4\n  [:a :b :c :d]\n  5\n  6\n  7\n  8\n  9)\n {:foo 1,\n  :bar \"c\",\n  :baz \"str\"}\n {:small-value [1 2 3],\n  :larger-value {:some-key \"foo\",\n                 :some-other-key \"bar\"}}\n #fipp.edn_test.Person{:first-name \"Brandon\",\n                       :last-name \"Bloom\"}\n #x 5\n #object[clojure.core.Atom\n         {:status :ready,\n          :val (0\n                1\n                2\n                3\n                4\n                5\n                6\n                7\n                8\n                9\n                10\n                11\n                12\n                13\n                14\n                15\n                16\n                17\n                18\n                19)}]\n #object[clojure.core$future_call$reify__123\n         \"0xDEADBEEF\"\n         {:status :ready,\n          :val 1}]\n #{:baz :bar :foo}]" "[(1\n  2\n  3\n  4\n  [:a :b :c :d]\n  5\n  6\n  7\n  8\n  9)\n {:foo 1, :bar \\c, :baz \"str\"}\n {:small-value [1 2 3],\n  :larger-value {:some-key \"foo\",\n                 :some-other-key \"bar\"}}\n #fipp.edn_test.Person{:first-name \"Brandon\",\n                       :last-name \"Bloom\"}\n #x 5\n #object[clojure.lang.Atom\n         \"0xDEADBEEF\"\n         {:status :ready,\n          :val (0\n                1\n                2\n                3\n                4\n                5\n                6\n                7\n                8\n                9\n                10\n                11\n                12\n                13\n                14\n                15\n                16\n                17\n                18\n                19)}]\n #object[clojure.core$future_call$reify__123\n         \"0xDEADBEEF\"\n         {:status :ready,\n          :val 1}]\n #{:baz :bar :foo}]"))

FAIL in (pprint-edn) (cljs/test.js:431:14)
Not quite Edn
expected: (= (with-out-str (pprint (var inc))) "#'clojure.core/inc\n")
  actual: (not (= "#'cljs.core/inc\n" "#'clojure.core/inc\n"))

Testing fipp.clojure-test

FAIL in (meta-test) (cljs/test.js:431:14)
metadata is omitted from identities
expected: (= (clean (with-out-str (pprint [(var inc) (with-meta (quote x) {:y 1})] {:print-meta true}))) "[#'clojure.core/inc ^{:y 1} x]")
  actual: (not (= "[#'clojure.core.inc ^{:y 1} x]" "[#'clojure.core/inc ^{:y 1} x]"))

Ran 11 tests containing 56 assertions.
4 failures, 0 errors.

I am happy to look into these if that would be helpful.

Escaping of newlines in strings

Currently it looks like fipp always escapes newlines in strings. For example:

user=> (require '[fipp.edn :as edn])
nil
user=> (def foo {:sql "select *
  #_=> from projects
  #_=> where id < 5"})
#'user/foo
user=> (edn/pretty foo)
[:group "{" [:align ([:span [:text ":sql"] " " [:text "\"select *\\nfrom projects\\nwhere id < 5\""]]) nil] "}"]
user=> (edn/pprint foo)
{:sql "select *\nfrom projects\nwhere id < 5"}
nil

My use case involves updating EDN files with handwritten SQL fragments, so for me, escaping of the newlines is harmful.

A solution I found was to copy and paste fipp.edn/EdnPrinter (~70 lines), then change visit-string from this:

  (visit-string [this x]
    [:text (binding [*print-readably* true]
             (pr-str x))])

to this:

 (visit-string [this x]
    ;; This is the part that changed.
    (binding [*print-readably* true]
      [:span "\""
       :pass x
       :span "\""]))

Is there a better way? If not, should there be? (E.g., a setting you can pass to EdnPrinter?)

:pass rendered before indentation

Hello fippsters! Thanks for your cool tool and all the hard work you've put into it!

I am new to fipp so I could very well be misunderstanding how to express myself in fipp and/or desired vs actual behavior, but here I go anyway:

Given the following code:

(require '[fipp.engine :as fe])

(fe/pprint-document
   [:group
    [:span [:pass "<"] "AA" [:pass ">"]]
    [:align
     :line
     [:span [:pass "<"] "BB" [:pass ">"]]
     :line
     [:span [:pass "<"] "CC" [:pass ">"]]
     [:align
      :line
      [:span [:pass "<"] "DD" [:pass ">"]]]]]
   {:width 6})

I get the following output:

<AA>
<  BB>
<  CC>
<    DD>

When I was more expecting something like:

<AA>
  <BB>
  <CC>
    <DD>

I noticed this while exploring using background colors in puget: greglook/puget#44.

fipp.edn/pprint is slow

My code:

(defn persist! [db]
  (let [start-time (now!)]
    (fs.writeFileSync
     (:storage-key schema/configs)
     (with-out-str (fipp/pprint (-> db (assoc :sessions {}) (assoc :saved-files {})))))
    (println (str "Took " (- (now!) start-time) "ms to wrote!"))))

And the result are <900 lines, 94k+ characters. Took 2500ms to write.

I tried to format with pr-str, and is <500ms estimated from experience.

Is there any room to make this function faster?

Using this file as example: https://github.com/mvc-works/coworkflow/blob/master/coir.edn

Babashka compatibility

Hi @brandonbloom!

Babashka is a Clojure interpreter which is suitable for scripting and has (very) fast startup.
It has the ability to execute Clojure libraries from source. Sometimes minor changes are needed to avoid things that babashka cannot (currently) do in a similar way how you would make a library compatible with ClojureScript: through reader conditionals. A recent example of this is the commit in specter.

Recently I've gotten questions about whether fipp and puget (which uses fipp) can run with babashka and I started investigating.
I found that with a few tweaks, it can work. Details here: babashka/babashka#1241.

Some things can be fixed in babashka (or the Clojure interpreter library it uses: SCI). Some things are better solved in the library. I will outline those here. Note that these changes can be made in such a way that they only affect behavior for bb while not changing anything for clj/cljs.

  1. in dequeue.cljc fall back on clojure.core vector operations instead of using rrb-vector. I realize this is worse performance-wise but for babashka this may be a reasonable compromise to get things working without pulling in rrb-vector.

  2. in format-hack in ednize.clj start adopting java.time rather then relying on ThreadLocals in clojure.instant. Babashka has full support for java.time while clojure.instant is based on classes prior to java.time. java.time is the modern way to do stuff with dates and times in Java and is available since Java 1.8.

My question to you: are you open to receiving PRs for (some of) the above issues, or should users of babashka maintain a bb-compatible fork somewhere else?

"No such namespace: cljs.core.rrb-vector" while loading in Lumo

Well, it's in Lumo https://github.com/anmonteiro/lumo I used to run the code with Boot and it works in JVM. Now I'm trying Lumo, and it was supposed to work thanks to the cljc files. However I got an error while loading it:

Loading dependencies for clojure.core.rrb-vector
Processing :use-macros for clojure.core.rrb-vector
Loading clojure.core.rrb-vector.macros macros namespace
Evaluating clojure.core.rrb-vector.macros
Namespace side effects for clojure.core.rrb-vector.macros$macros
Processing :use-macros for clojure.core.rrb-vector.macros$macros
Processing :require-macros for clojure.core.rrb-vector.macros$macros
Loading result:  {:error #error {:message Could not eval clojure.core.rrb-vector.macros in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}, :cause #error {:message Unable to resolve var: assert in this context at line 9 clojure/core/rrb_vector/macros.clj, :data {:file clojure/core/rrb_vector/macros.clj, :line 9, :column 5, :tag :cljs/analysis-error}}}}
Loading cljs.core.rrb-vector namespace
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
Loading result:  {:error #error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}}
#error {:message No such namespace: cljs.core.rrb-vector, could not locate cljs/core/rrb_vector.cljs, cljs/core/rrb_vector.cljc, or Closure namespace "cljs.core.rrb-vector" in file clojure/core/rrb_vector/macros.clj, :data {:tag :cljs/analysis-error}}

The Commands are:

export boot_deps=`boot show -c`
lumo -Kvc $boot_deps:src/ -i server.cljs

Since Lumo is using Bootstrapped ClojureScript, I guess it caused this problem. But I can't figure out why. By reading from the code, it should be working, this is weird.

(:require [clojure.core.rrb-vector :as rrb]))

https://github.com/clojure/core.rrb-vector/blob/master/src/main/cljs/clojure/core/rrb_vector.cljs#L1

java.sql.Timestamp not guaranteed to exist

In later versions of the JDK (from 11 up I believe), certain classes are not guaranteed to be available, including java.sql.Timestamp. This causes an issue with fipp.ednize:

REPL-y 0.4.3, nREPL 0.6.0
Clojure 1.10.0
OpenJDK 64-Bit Server VM 13.0.1+9
...
user=> (require 'fipp.ednize)
Syntax error (ClassNotFoundException) compiling at (ednize.clj:1:1).
java/sql/Timestamp

Handle mixed lists/vectors

I was generating a tree of mixed persistent lists and vectors and noticed because of this case that they don't produce the same output.

(pprint-document [:span "foo {" [:align "bar" :line "baz"] "}"] {:width 500}) produces the indended alignment

foo {bar
     baz}

(pprint-document [:span "foo {" '(:align "bar" :line "baz") "}"] {:width 500}) ignores the alignment

foo {bar
baz}

Is there a reason why seq? and vector? are different cases?

Parasitic newline at the end of the output.

This might be intentional but it's not consistent with Clojure's pprint. The code

(str (with-out-str (fipp.edn/pprint 1)) "This should be on the same line!")

generates the string "1\r\nThis should be on the same line!". I regard this as parasitic because it's none of fipp's business what comes after the output :)

consl does not exist, compiling:(fipp/printer.clj:1:1)

On calling (:require [clojure.data.finger-tree :refer (double-list consl ft-concat)]) in the fipp.printer namespace declaration, an IllegalAccessError is thrown, saying: consl does not exist, compiling:(fipp/printer.clj:1:1). This must be a dependency conflict, because I'm also using clojure.data.finger-tree 0.0.2 as a dependency, whereas fipp uses version 0.0.1.

This is because clojure.data.finger-tree's consl function is now conjl, with the same argument order.

Perhaps an update could be made in the project.clj file to use the latest version of clojure.data.finger-tree (0.0.2).

Code cleanups

  1. Seems like fipp.edn can be defined in terms of fipp.clojure

  2. After Clojure 1.7 release, move from reducers to transducers. Replace t/each with the new run! function.

Others?

Conflicts with Clojure 1.9 alphas

I get the following warning with Clojure 1.9 (currently using Alpha 9, but several of the previous Alpha's had the same problem):

WARNING: boolean? already refers to: #'clojure.core/boolean? in namespace: fipp.visit, being replaced by: #'fipp.visit/boolean?

Missing requirements?

Hi - Tried running the README example and I seem to be missing something. My project.clj already has [fipp "0.6.2"]

~/cljtst > lein repl
nREPL server started on port 36876 on host 127.0.0.1 - nrepl://127.0.0.1:36876
REPL-y 0.3.5, nREPL 0.2.6
Clojure 1.7.0-alpha3
Java HotSpot(TM) 64-Bit Server VM 1.8.0_45-b14
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e

user=> (require '[fipp.engine :refer (pprint-document)])

FileNotFoundException Could not locate fipp/engine__init.class or fipp/engine.clj on classpath. clojure.lang.RT.load (RT.java:443)
user=>

Compilation warning

WARNING: Use of undeclared Var fipp.engine/class at line 133 resources/public/js/out/fipp/engine.cljc

clojure 1.9 boolean? conflict

When using with clojure 1.9

WARNING: boolean? already refers to: #'clojure.core/boolean? in namespace: fipp.visit, being replaced by: #'fipp.visit/boolean?

fipp/src/fipp/visit.cljc

Lines 31 to 33 in f644b88

;;TODO: CLJ-1719 and CLJS-1241
(defn boolean? [x]
(or (true? x) (false? x)))

pprint-document throws exception for high values of :width on certain inputs

I'm occasionally encountering an exception when calling pprint-document with (somewhat) complex data structures and high values of :width.

Some observations:

  • The strings being printed don't matter — in my example below, I've replaced them all with "" to save space.
  • The problem only happens once the input data reaches a certain size. If I try to simplify the example below too much, the issue disappears.
  • The exception is thrown in clojure.core.rrb-vector, seemingly after most of the data has been processed.
  • The bug is present in fipp 0.6.14, but also with both fipp and clojure.core.rrb-vector checked out to their respective latest commits on master.
(def bad-data '[:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:pass ""] "" [:pass ""]] :line [:span [:pass ""] "" [:pass ""]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]] :line [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:group [:span [:pass ""] "" [:pass ""]] [:align ([:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]]])] [:span [:pass ""] "" [:pass ""]]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]] [:span "" :line] [:span [:span [:pass ""] "" [:pass ""]] "" [:span [:pass ""] "" [:pass ""]]])] [:span [:pass ""] "" [:pass ""]]])
(fipp.engine/pprint-document bad-data)               ;; works
(fipp.engine/pprint-document bad-data {:width 1000}) ;; throws ClassCastException clojure.lang.PersistentVector$Node cannot be cast to [I

The exception thrown:

#error {
 :cause "clojure.lang.PersistentVector$Node cannot be cast to [I"
 :via
 [{:type java.lang.ClassCastException
   :message "clojure.lang.PersistentVector$Node cannot be cast to [I"
   :at [clojure.lang.Numbers ints "Numbers.java" 1396]}]
 :trace
 [[clojure.lang.Numbers ints "Numbers.java" 1396]
  [clojure.core.rrb_vector.rrbt$slot_count invokeStatic "rrbt.clj" 1286]
  [clojure.core.rrb_vector.rrbt$slot_count invoke "rrbt.clj" 1280]
  [clojure.core.rrb_vector.rrbt$subtree_branch_count invokeStatic "rrbt.clj" 1305]
  [clojure.core.rrb_vector.rrbt$subtree_branch_count invoke "rrbt.clj" 1289]
  [clojure.core.rrb_vector.rrbt$rebalance invokeStatic "rrbt.clj" 1392]
  [clojure.core.rrb_vector.rrbt$rebalance invoke "rrbt.clj" 1384]
  [clojure.core.rrb_vector.rrbt$zippath invokeStatic "rrbt.clj" 1492]
  [clojure.core.rrb_vector.rrbt$zippath invoke "rrbt.clj" 1469]
  [clojure.core.rrb_vector.rrbt$splice_rrbts invokeStatic "rrbt.clj" 1566]
  [clojure.core.rrb_vector.rrbt$splice_rrbts invoke "rrbt.clj" 1536]
  [clojure.core.rrb_vector.rrbt.Vector splicev "rrbt.clj" 1111]
  [clojure.core.rrb_vector.interop$eval2324$fn__2325 invoke "interop.clj" 30]
  [clojure.core.rrb_vector.protocols$eval1711$fn__1712$G__1702__1719 invoke "protocols.clj" 3]
  [clojure.core.rrb_vector$catvec invokeStatic "rrb_vector.clj" 57]
  [clojure.core.rrb_vector$catvec invoke "rrb_vector.clj" 48]
  [fipp.deque$conjlr invokeStatic "deque.cljc" 16]
  [fipp.deque$conjlr invoke "deque.cljc" 15]
  [fipp.engine$annotate_begins$fn__2457$fn__2459 invoke "engine.cljc" 121]
  [fipp.engine$annotate_rights$fn__2450 invoke "engine.cljc" 85]
  [clojure.lang.ArrayChunk reduce "ArrayChunk.java" 58]
  [clojure.core.protocols$fn__6750 invokeStatic "protocols.clj" 136]
  [clojure.core.protocols$fn__6750 invoke "protocols.clj" 124]
  [clojure.core.protocols$fn__6710$G__6705__6719 invoke "protocols.clj" 19]
  [clojure.core.protocols$seq_reduce invokeStatic "protocols.clj" 31]
  [clojure.core.protocols$fn__6738 invokeStatic "protocols.clj" 75]
  [clojure.core.protocols$fn__6738 invoke "protocols.clj" 75]
  [clojure.core.protocols$fn__6684$G__6679__6697 invoke "protocols.clj" 13]
  [clojure.core$transduce invokeStatic "core.clj" 6601]
  [clojure.core.Eduction reduce "core.clj" 7360]
  [clojure.core$reduce invokeStatic "core.clj" 6544]
  [clojure.core$run_BANG_ invokeStatic "core.clj" 7388]
  [clojure.core$run_BANG_ invoke "core.clj" 7388]
  [fipp.engine$pprint_document invokeStatic "engine.cljc" 241]
  [fipp.engine$pprint_document invoke "engine.cljc" 234]
  [user$eval2630 invokeStatic "form-init1429134254741924018.clj" 1]
  [user$eval2630 invoke "form-init1429134254741924018.clj" 1]
  [clojure.lang.Compiler eval "Compiler.java" 6927]
  [clojure.lang.Compiler eval "Compiler.java" 6890]
  [clojure.core$eval invokeStatic "core.clj" 3105]
  [clojure.core$eval invoke "core.clj" 3101]
  [clojure.main$repl$read_eval_print__7408$fn__7411 invoke "main.clj" 240]
  [clojure.main$repl$read_eval_print__7408 invoke "main.clj" 240]
  [clojure.main$repl$fn__7417 invoke "main.clj" 258]
  [clojure.main$repl invokeStatic "main.clj" 258]
  [clojure.main$repl doInvoke "main.clj" 174]
  [clojure.lang.RestFn invoke "RestFn.java" 1523]
  [clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__648 invoke "interruptible_eval.clj" 87]
  [clojure.lang.AFn applyToHelper "AFn.java" 152]
  [clojure.lang.AFn applyTo "AFn.java" 144]
  [clojure.core$apply invokeStatic "core.clj" 646]
  [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1881]
  [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1881]
  [clojure.lang.RestFn invoke "RestFn.java" 425]
  [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 85]
  [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 55]
  [clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__693$fn__696 invoke "interruptible_eval.clj" 222]
  [clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__688 invoke "interruptible_eval.clj" 190]
  [clojure.lang.AFn run "AFn.java" 22]
  [java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1167]
  [java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 641]
  [java.lang.Thread run "Thread.java" 844]]}

I have a suspicion that the bug actually lies in clojure.core.rrb-vector  — If I replace the calls in fipp.deque to clojure.core.rrb-vector/catvec with concat, the issue goes away. However, my attempts to prove this (by serializing and re-playing all rrb-vector operations for the above data) have been unsuccessful.

Note: I ran into this issue when using puget, which depends on fipp. I've filed an issue there as well: greglook/puget#39

pprint does not print default tagged literals/elements

Hi,
I am having troubles making the fipp pretty print behave the same way as the regular cljs or clj print function when it goes down to tagged elements that are by default used to denote custom records.

See example below - pr, pr-str, print and print-str functions all use the default approach toward creating (edn-like) tagged element for MyRecord and all produce the same result:
#cljs.user.MyRecord{:value "a"}

On the other hand fipp pprint (both clojure as well as edn/pprint) just errors out (I have tested in cljs only so far):
cljs.user=> (defrecord MyRecord [value])
cljs.user/MyRecord
cljs.user=> (pr (MyRecord. "a"))
#cljs.user.MyRecord{:value "a"}
nil
cljs.user=> (fipp.clojure/pprint (MyRecord. "a"))
#object[Error Error: Assert failed: (symbol? tag)]

Thanks & Regards
Miro

print unreadable symbol utilizing #=(symbol ...) for *read-eval*

with two small tweaks, we could achieve REPL copy/paste-able output a la Python's "repr"

namely, have symbols rendered as:

[:text (str "(symbol \"" x "\")")]

and seqs rendered as:

(pretty-col this "'(" x :line ")" visit)

Any reason (besides annoyance-parity with cljs.pprint/pprint) this wasn't considered?

Use of undeclared Var clojure.core.rrb-vector.rrbt/Transient

Full logs:

yarn watch
yarn run v1.19.1
$ shadow-cljs watch client server
shadow-cljs - config: /Users/chen/repo/cirru/calcit-editor/shadow-cljs.edn  cli version: 2.8.67  node: v12.6.0
shadow-cljs - updating dependencies
shadow-cljs - dependencies updated
shadow-cljs - HTTP server available at http://localhost:7000
shadow-cljs - server version: 2.8.67 running at http://localhost:9630
shadow-cljs - nREPL server started on port 51221
shadow-cljs - watching build :client
shadow-cljs - watching build :server
[:client] Configuring build.
[:server] Configuring build.
[:server] Compiling ...
[:client] Compiling ...
[:server] Build completed. (124 files, 20 compiled, 1 warnings, 7.69s)

------ WARNING #1 - :undeclared-var --------------------------------------------
 Resource: clojure/core/rrb_vector/trees.cljs:8:33
--------------------------------------------------------------------------------
   5 |
   6 | (defn tail-offset [vec]
   7 |   (let [cnt (.-cnt vec)
   8 |         tail-len (if (instance? clojure.core.rrb-vector.rrbt/Transient vec)
---------------------------------------^----------------------------------------
 Use of undeclared Var clojure.core.rrb-vector.rrbt/Transient
--------------------------------------------------------------------------------
   9 |                    (.-tidx vec)
  10 |                    (alength (.-tail vec)))]
  11 |     (- cnt tail-len)))
  12 |
--------------------------------------------------------------------------------
[:client] Build completed. (238 files, 20 compiled, 1 warnings, 9.73s)

------ WARNING #1 - :undeclared-var --------------------------------------------
 Resource: clojure/core/rrb_vector/trees.cljs:8:33
--------------------------------------------------------------------------------
   5 |
   6 | (defn tail-offset [vec]
   7 |   (let [cnt (.-cnt vec)
   8 |         tail-len (if (instance? clojure.core.rrb-vector.rrbt/Transient vec)
---------------------------------------^----------------------------------------
 Use of undeclared Var clojure.core.rrb-vector.rrbt/Transient
--------------------------------------------------------------------------------
   9 |                    (.-tidx vec)
  10 |                    (alength (.-tail vec)))]
  11 |     (- cnt tail-len)))
  12 |
--------------------------------------------------------------------------------

I think it's highly related to 2534620

Anything I should do on my side to upgrade the library?

Various non-idiomatic whitespace from fipp.clojure

I have a lot of code that is generated with clojure.pprint and now trying fipp for better readability and also performance. Here are the changes after the migration:
Quamolit/quamolit@f8bc00b?diff=unified

Some highlights:

  • in some places two spaces indentations changed to one space, like:
(a
..b
..c)
(a
.b
.c)
  • commas are inserted in HashMaps and vectors after let
  • unexpected whitespace in (ns quamolit.schema )
  • body of cond now have \n INDENT INDENT between a and of-a is such an example, rather than a single space:
(cond
..a
....of-a
..b
....of-b
..:else e)

Since these details are not listed in the docs, I got the questions to ask if all of them are expected(at least code runs well)? And does it help in helping fipp in achieving better results?

I don't have the number but definitely it's faster than clojure.pprint according to my experience.

Cannot load fipp in Java 9 using bootclasspath

Hello,

I'm trying to install ultra which depends on fipp but I'm getting the following error:

$ lein repl
clojure.lang.Compiler$CompilerException: Syntax error compiling var at (fipp/ednize.clj:71:13).
#:clojure.error{:phase :compile-syntax-check, :line 71, :column 13, :source "fipp/ednize.clj", :symbol var}
 at clojure.lang.Compiler.analyzeSeq (Compiler.java:7114)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$InvokeExpr.parse (Compiler.java:3888)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7108)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6384)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7106)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7094)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6120)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5467)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:4029)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7104)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7094)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$MapExpr.parse (Compiler.java:3104)
    clojure.lang.Compiler.analyze (Compiler.java:6797)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$InvokeExpr.parse (Compiler.java:3888)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7108)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6120)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5467)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:4029)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7104)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.eval (Compiler.java:7173)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    fipp.visit$eval2964$loading__6706__auto____2965.invoke (visit.cljc:1)
    fipp.visit$eval2964.invokeStatic (visit.cljc:1)
    fipp.visit$eval2964.invoke (visit.cljc:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:619)
    puget.printer$eval2098$loading__6706__auto____2099.invoke (printer.clj:1)
    puget.printer$eval2098.invokeStatic (printer.clj:1)
    puget.printer$eval2098.invoke (printer.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    whidbey.repl$eval2049$loading__6706__auto____2050.invoke (repl.clj:1)
    whidbey.repl$eval2049.invokeStatic (repl.clj:1)
    whidbey.repl$eval2049.invoke (repl.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:482)
    ultra.colorscheme$eval1605$loading__6706__auto____1606.invoke (colorscheme.clj:1)
    ultra.colorscheme$eval1605.invokeStatic (colorscheme.clj:1)
    ultra.colorscheme$eval1605.invoke (colorscheme.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    ultra.hardcore$eval670$loading__6706__auto____671.invoke (hardcore.clj:1)
    ultra.hardcore$eval670.invokeStatic (hardcore.clj:1)
    ultra.hardcore$eval670.invoke (hardcore.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:512)
    ultra.plugin$eval662$loading__6706__auto____663.invoke (plugin.clj:1)
    ultra.plugin$eval662.invokeStatic (plugin.clj:1)
    ultra.plugin$eval662.invoke (plugin.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:102)
    leiningen.core.utils$require_resolve.invoke (utils.clj:95)
    leiningen.core.project$apply_middleware.invokeStatic (project.clj:816)
    leiningen.core.project$apply_middleware.invoke (project.clj:810)
    clojure.core.protocols$naive_seq_reduce.invokeStatic (protocols.clj:62)
    clojure.core.protocols$interface_or_naive_reduce.invokeStatic (protocols.clj:72)
    clojure.core.protocols$fn__8144.invokeStatic (protocols.clj:169)
    clojure.core.protocols/fn (protocols.clj:124)
    clojure.core.protocols$fn__8099$G__8094__8108.invoke (protocols.clj:19)
    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
    clojure.core.protocols$fn__8131.invokeStatic (protocols.clj:75)
    clojure.core.protocols/fn (protocols.clj:75)
    clojure.core.protocols$fn__8073$G__8068__8086.invoke (protocols.clj:13)
    clojure.core$reduce.invokeStatic (core.clj:6828)
    clojure.core$reduce.invoke (core.clj:6810)
    leiningen.core.project$apply_middleware.invokeStatic (project.clj:812)
    leiningen.core.project$apply_middleware.invoke (project.clj:810)
    leiningen.core.project$activate_middleware.invokeStatic (project.clj:844)
    leiningen.core.project$activate_middleware.invoke (project.clj:840)
    leiningen.core.project$init_project.invokeStatic (project.clj:986)
    leiningen.core.project$init_project.invoke (project.clj:974)
    leiningen.core.project$read.invokeStatic (project.clj:1057)
    leiningen.core.project$read.invoke (project.clj:1054)
    leiningen.core.project$read.invokeStatic (project.clj:1058)
    leiningen.core.project$read.invoke (project.clj:1054)
    leiningen.core.main$_main$fn__6771.invoke (main.clj:444)
    leiningen.core.main$_main.invokeStatic (main.clj:439)
    leiningen.core.main$_main.doInvoke (main.clj:436)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.core$apply.invokeStatic (core.clj:665)
    clojure.main$main_opt.invokeStatic (main.clj:491)
    clojure.main$main_opt.invoke (main.clj:487)
    clojure.main$main.invokeStatic (main.clj:598)
    clojure.main$main.doInvoke (main.clj:561)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.main.main (main.java:37)
Caused by: java.lang.RuntimeException: Unable to resolve var: clojure.instant/thread-local-utc-date-format in this context
 at clojure.lang.Util.runtimeException (Util.java:221)
    clojure.lang.Compiler$TheVarExpr$Parser.parse (Compiler.java:720)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7106)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$InvokeExpr.parse (Compiler.java:3888)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7108)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6384)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7106)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7094)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6120)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5467)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:4029)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7104)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7094)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$MapExpr.parse (Compiler.java:3104)
    clojure.lang.Compiler.analyze (Compiler.java:6797)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$InvokeExpr.parse (Compiler.java:3888)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7108)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.analyze (Compiler.java:6745)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6120)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5467)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:4029)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:7104)
    clojure.lang.Compiler.analyze (Compiler.java:6789)
    clojure.lang.Compiler.eval (Compiler.java:7173)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    fipp.visit$eval2964$loading__6706__auto____2965.invoke (visit.cljc:1)
    fipp.visit$eval2964.invokeStatic (visit.cljc:1)
    fipp.visit$eval2964.invoke (visit.cljc:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:619)
    puget.printer$eval2098$loading__6706__auto____2099.invoke (printer.clj:1)
    puget.printer$eval2098.invokeStatic (printer.clj:1)
    puget.printer$eval2098.invoke (printer.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    whidbey.repl$eval2049$loading__6706__auto____2050.invoke (repl.clj:1)
    whidbey.repl$eval2049.invokeStatic (repl.clj:1)
    whidbey.repl$eval2049.invoke (repl.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:482)
    ultra.colorscheme$eval1605$loading__6706__auto____1606.invoke (colorscheme.clj:1)
    ultra.colorscheme$eval1605.invokeStatic (colorscheme.clj:1)
    ultra.colorscheme$eval1605.invoke (colorscheme.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    ultra.hardcore$eval670$loading__6706__auto____671.invoke (hardcore.clj:1)
    ultra.hardcore$eval670.invokeStatic (hardcore.clj:1)
    ultra.hardcore$eval670.invoke (hardcore.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:512)
    ultra.plugin$eval662$loading__6706__auto____663.invoke (plugin.clj:1)
    ultra.plugin$eval662.invokeStatic (plugin.clj:1)
    ultra.plugin$eval662.invoke (plugin.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:7176)
    clojure.lang.Compiler.eval (Compiler.java:7165)
    clojure.lang.Compiler.load (Compiler.java:7635)
    clojure.lang.RT.loadResourceScript (RT.java:381)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.load (RT.java:463)
    clojure.lang.RT.load (RT.java:428)
    clojure.core$load$fn__6824.invoke (core.clj:6126)
    clojure.core$load.invokeStatic (core.clj:6125)
    clojure.core$load.doInvoke (core.clj:6109)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5908)
    clojure.core$load_one.invoke (core.clj:5903)
    clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
    clojure.core$load_lib.invokeStatic (core.clj:5947)
    clojure.core$load_lib.doInvoke (core.clj:5928)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$load_libs.invokeStatic (core.clj:5985)
    clojure.core$load_libs.doInvoke (core.clj:5969)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$require.invokeStatic (core.clj:6007)
    clojure.core$require.doInvoke (core.clj:6007)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:102)
    leiningen.core.utils$require_resolve.invoke (utils.clj:95)
    leiningen.core.project$apply_middleware.invokeStatic (project.clj:816)
    leiningen.core.project$apply_middleware.invoke (project.clj:810)
    clojure.core.protocols$naive_seq_reduce.invokeStatic (protocols.clj:62)
    clojure.core.protocols$interface_or_naive_reduce.invokeStatic (protocols.clj:72)
    clojure.core.protocols$fn__8144.invokeStatic (protocols.clj:169)
    clojure.core.protocols/fn (protocols.clj:124)
    clojure.core.protocols$fn__8099$G__8094__8108.invoke (protocols.clj:19)
    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
    clojure.core.protocols$fn__8131.invokeStatic (protocols.clj:75)
    clojure.core.protocols/fn (protocols.clj:75)
    clojure.core.protocols$fn__8073$G__8068__8086.invoke (protocols.clj:13)
    clojure.core$reduce.invokeStatic (core.clj:6828)
    clojure.core$reduce.invoke (core.clj:6810)
    leiningen.core.project$apply_middleware.invokeStatic (project.clj:812)
    leiningen.core.project$apply_middleware.invoke (project.clj:810)
    leiningen.core.project$activate_middleware.invokeStatic (project.clj:844)
    leiningen.core.project$activate_middleware.invoke (project.clj:840)
    leiningen.core.project$init_project.invokeStatic (project.clj:986)
    leiningen.core.project$init_project.invoke (project.clj:974)
    leiningen.core.project$read.invokeStatic (project.clj:1057)
    leiningen.core.project$read.invoke (project.clj:1054)
    leiningen.core.project$read.invokeStatic (project.clj:1058)
    leiningen.core.project$read.invoke (project.clj:1054)
    leiningen.core.main$_main$fn__6771.invoke (main.clj:444)
    leiningen.core.main$_main.invokeStatic (main.clj:439)
    leiningen.core.main$_main.doInvoke (main.clj:436)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.core$apply.invokeStatic (core.clj:665)
    clojure.main$main_opt.invokeStatic (main.clj:491)
    clojure.main$main_opt.invoke (main.clj:487)
    clojure.main$main.invokeStatic (main.clj:598)
    clojure.main$main.doInvoke (main.clj:561)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.main.main (main.java:37)

I have the following environment:

$ lein --version
Leiningen 2.9.0 on Java 11.0.2 OpenJDK 64-Bit Server VM
$ clojure
Clojure 1.10.0
user=> 

I see someone already reported the problem on the ultra repo.

I'm totally new to Clojure so I may be missing to important infos here so let me know if you need anything else.

Just a small warning in CLJS (undeclared var `fipp.edn/*file*`)

Getting this error in Figwheel:

[Figwheel:WARNING] Compile Warning: Use of undeclared Var fipp.edn/*file*  generated/dev/public/js/generated/fipp/edn.cljc   line:111  column:45

This is due to the fipp.edn/dbg macro being added but not being conditionalized to :clj (or at very least *file* being conditionalized somehow).

Incompatible with Java 11 due to org.clojure/core.rrb-vector dependency

Loading namespaces from fipp consuming libraries such as https://github.com/greglook/puget and https://github.com/dgrnbrg/spyscope causes a syntax error:

Syntax error (IllegalArgumentException) compiling deftype* at (clojure/core/rrb_vector/rrbt.clj:282:1).
Must hint overloaded method: toArray

This issue is repaired in a recent patch of org.clojure/core.rrb-vector [org.clojure/core.rrb-vector "0.1.2"]

While users of spyscope and puget can utilize managed dependencies to solve this issue, it would be great if it could be patched upsteam.

consider automating tests on circleci

Hello!

Before working on #66, I found #67 and this made me wonder if you'd be interested in automating the running of tests on circleci.

As part of this work I propose:

  1. integrating cljs tests into lein via lein-cljsbuild.
  2. creating a circleci config that would automatically run tests on commit.

I don't know that automatically running the benchmark would be of interest/value, I guess it would test that it still works.

How to specify fixed width floats in specific tagged-literals for output purposes

I've been working with debugging larger datastructures containing many instances of the shape and vector objects from https://github.com/thi-ng/geom. I've found fipp to be very useful for ensuring the debug output is readable, so thank you.

However, I've also found it useful to simplify the output by doing tricks like:

(extend-protocol IEdn
  thi.ng.geom.vector.Vec2
  (-edn [s]
    (let [[x y] s]
      (tagged-literal 'v2 [(.toFixed x 2) (.toFixed y 2)])))

So that instead of verbose output like

#thi.ng.geom.vector.Vec2[0.15568929809,5.54892085920385]

It's simplified to

#v2[0.16, 5.55]

However, .toFixed is converting the output element type to string too early, so the visitor pass detects it as a string and instead it prints like:

#v2["0.16", "5.55"]

I've succeeded in getting output without the string by rounding each of the x,y coordinate values to two decimal places, keeping them a number, but that occasionally expands back to the max width for each coordinate due to floating point representation errors.

So my question is, is there a way to control formatting by passing through a fixed float, or is this simply behavior that is out of the scope of this library?

Is there a way to pass through formatting instructions during the EDN conversion prior to visiting each element? Or is this attempting to do the transformation in the wrong place, and instead should look into something akin to fipp.clojure to adjust formatting in the output. However based on

fipp/src/fipp/edn.cljc

Lines 55 to 58 in a4cb207

(visit-seq [this x]
(if-let [pretty (symbols (first x))]
(pretty this x)
(pretty-coll this "(" x :line ")" visit)))

It looks like the pretty symbols override only works for '(symbol a b c) forms, but there does not appear to be equivalent functionality for overriding tagged-literals in

fipp/src/fipp/edn.cljc

Lines 71 to 76 in a4cb207

(visit-tagged [this {:keys [tag form]}]
[:group "#" (str tag)
(when (or (and print-meta (meta form))
(not (coll? form)))
" ")
(visit this form)])
Would it make sense to add another map key like :symbols, such as :tagged-literals that supported overriding the printer visitor for each tagged literal? Should I look into writing my own EdnPrinter with this functionality?

Happy to work on a PR if there is a recommended approach or even just to document this behavior, but am uncertain which way is intended. Thanks again for creating such a useful pretty printer interface.

Many math warning aginst Clojure 1.10

Hi there,

I get the following in fipp against the new Clojure 1.10:

Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:88:11 - call: public static boolean clojure.lang.Numbers.lt(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:176:16 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:177:16 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:178:16 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:179:48 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_dec(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:179:25 - call: public static long clojure.lang.Numbers.shiftRight(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:217:23 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:235:29 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:250:11 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:259:20 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:269:22 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:273:31 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:275:42 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:287:36 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:290:29 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/nodes.clj:308:27 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/transients.clj:187:35 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/transients.clj:198:41 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/transients.clj:223:15 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/transients.clj:257:28 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:270:26 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:327:29 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:341:36 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:356:35 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:387:34 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:392:29 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:400:39 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:807:30 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1001:24 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1205:26 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:559:32 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1253:5 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1282:9 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1292:13 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1314:14 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1317:14 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1318:30 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_dec(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1318:24 - call: public static java.lang.Number clojure.lang.Numbers.quotient(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1318:19 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_inc(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1318:14 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1320:7 - call: public static boolean clojure.lang.Numbers.lte(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1323:11 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1323:7 - call: public static boolean clojure.lang.Numbers.lte(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1324:21 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1345:22 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1365:47 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1366:42 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1378:51 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1390:16 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1393:16 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1394:32 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_dec(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1394:26 - call: public static java.lang.Number clojure.lang.Numbers.quotient(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1394:21 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_inc(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1394:16 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1396:9 - call: public static boolean clojure.lang.Numbers.lte(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1399:13 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1399:9 - call: public static boolean clojure.lang.Numbers.lte(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1448:35 - call: public static boolean clojure.lang.Numbers.gt(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1449:29 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1451:33 - call: public static boolean clojure.lang.Numbers.gte(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1453:54 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1455:27 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1462:32 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1462:56 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_dec(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1463:42 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_inc(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1471:7 - call: public static boolean clojure.lang.Numbers.equiv(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1476:37 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1477:25 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1477:35 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1484:37 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1485:25 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1485:35 - call: public static long clojure.lang.Numbers.shiftLeft(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1488:42 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1491:40 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1496:18 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1502:18 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1522:30 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1562:14 - call: public static java.lang.Object clojure.lang.Numbers.max(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1572:19 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1573:19 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_minus(long,java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1592:52 - call: public static java.lang.Number clojure.lang.Numbers.unchecked_add(java.lang.Object,long).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1655:32 - call: public static boolean clojure.lang.Numbers.isZero(java.lang.Object).
Boxed math warning, cider/inlined_deps/fipp/v0v6v13/corerrb_vector/v0v0v12/clojure/core/rrb_vector/rrbt.clj:1859:30 - call: public static boolean clojure.lang.Numbers.isPos(java.lang.Object).

It is a bit verbose because inlined in cider and what it seems like is that some reflection mechanism has changed and now warnings are reported from core.rrb.

Maybe a bump will be enough?

deeply nested groups overflow the stack

user=> (require '[fipp.engine :as e])
nil
user=> (def groups (first (drop 1000 (iterate (fn [x] [:group x]) [:text "hi"]))))
#'user/groups
user=> (e/serialize groups)

StackOverflowError   clojure.lang.Cons.next (Cons.java:39)

owing to the ping-ponging between serialize and serialize-node (so the same thing would presumably also occur for e.g. span.)

print-table of nested map

Can I do something like

(print-table [ {:a {:b 1 :c 2} :d 3}  {:a {:b 4 :c 5} :d 6} ]
                  [ [:a :c]  :d] )

Result would be

:a :c     +  :d
+++++++++++++++
2         +  3
5         +  6

Nested maps are not supported by clojure.pprint/print-table
And I didn't find any other lib that would allow me to do that.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.