brandonbloom / fipp Goto Github PK
View Code? Open in Web Editor NEWFast Idiomatic Pretty Printer for Clojure
Fast Idiomatic Pretty Printer for Clojure
Pretty-printing maps uses commas.
Would you consider a PR to make the usage of commas optional?
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?
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
Lines 55 to 58 in a4cb207
'(symbol a b c)
forms, but there does not appear to be equivalent functionality for overriding tagged-literals inLines 71 to 76 in a4cb207
: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.
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
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
.)
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).
Protocols are not flexible enough, for a variety of reasons.
clojure.core/*print-level*
clojure.core/*print-length*
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.
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.
WARNING: Use of undeclared Var fipp.engine/class at line 133 resources/public/js/out/fipp/engine.cljc
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.
Line 4 in 07d138e
In a vector of largish maps it can be nice to separate each one with an empty line.
Hi there,
Thanks for this great library! I'm finding that BigDecimal
s 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
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=>
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:
(a
..b
..c)
(a
.b
.c)
let
(ns quamolit.schema )
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.
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?
https://github.com/clojure/core.rrb-vector
Bonus: There is currently a cljs implementation of rrb-vectors.
When using with clojure 1.9
WARNING: boolean? already refers to: #'clojure.core/boolean? in namespace: fipp.visit, being replaced by: #'fipp.visit/boolean?
Lines 31 to 33 in f644b88
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?
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}"]
I'm occasionally encountering an exception when calling pprint-document
with (somewhat) complex data structures and high values of :width
.
Some observations:
""
to save space.(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
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.
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
?)
Should print something like #<circular>
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 :).
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?
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?
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.
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:
I don't know that automatically running the benchmark would be of interest/value, I guess it would test that it still works.
never seen this before, I wasn't sure if it's an issue with lein-outdated or how fipp is deployed.
% lein outdated
[fipp/fipp "0.2.0-SNAPSHOT"] is available but we use "0.3.0-SNAPSHOT"
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 :)
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
I just want to uniformly change the edn's default indentation length to 2 instead of 1.
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
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.
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.
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?
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.
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.
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?
Requires either A) Switching to core.async or B) Porting transduce
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.
Hiya!
While preparing to work on #66, I wanted to make sure all tests pass first.
So I ran what seemed to make sense:
lein test
lein run -m fipp.benchmark
./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.
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).
Seems like fipp.edn
can be defined in terms of fipp.clojure
After Clojure 1.7 release, move from reducers to transducers. Replace t/each
with the new run!
function.
Others?
I was wondering if you'd be open to making the newline generated here optional: https://github.com/brandonbloom/fipp/blob/master/src/fipp/engine.cljc#L245. This is motivated in part by my looking for naive workarounds to this - greglook/whidbey#30; let me know if I'm just barking up the wrong tree here.
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.
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.
core.rrb-vector's next release will include a fix for JDK 11 compatibility, at which point fipp should be updated as well.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.