clerk 2024-10-02

I’m getting a cannot invoke “Object.hashCode()” because key is null. It’s coming from a macro that expands to a do block that ultimately returns a custom type. Should I implement a protocol on the custom type or is this a cider issue?

can you paste a stacktrace?

1. Unhandled java.lang.NullPointerException
   Cannot invoke "Object.hashCode()" because "key" is null

    ConcurrentHashMap.java:  936  java.util.concurrent.ConcurrentHashMap/get
            Namespace.java:  188  clojure.lang.Namespace/find
                  core.clj: 4131  clojure.core/find-ns
                  core.clj: 4161  clojure.core/the-ns
                  core.clj: 4370  clojure.core/ns-resolve
                  core.clj: 4360  clojure.core/ns-resolve
                  core.clj: 4373  clojure.core/resolve
                  core.clj: 4373  clojure.core/resolve
               viewer.cljc:  880  nextjournal.clerk.viewer$fn__22699/invokeStatic
               viewer.cljc:  875  nextjournal.clerk.viewer$fn__22699/invoke
                  core.clj: 6231  clojure.core/update
                  core.clj: 6223  clojure.core/update
                  AFn.java:  160  clojure.lang.AFn/applyToHelper
               RestFn.java:  132  clojure.lang.RestFn/applyTo
                  core.clj:  673  clojure.core/apply
                  core.clj:  662  clojure.core/apply
               viewer.cljc:  391  nextjournal.clerk.viewer$update_val$fn__22520/invoke
               viewer.cljc: 1367  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1361  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1562  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             protocols.clj:   49  clojure.core.protocols/iter-reduce
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   13  clojure.core.protocols/fn/G
                  core.clj: 6947  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             ArraySeq.java:  114  clojure.lang.ArraySeq/reduce
                  core.clj: 6946  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             protocols.clj:   49  clojure.core.protocols/iter-reduce
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   13  clojure.core.protocols/fn/G
                  core.clj: 6947  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             ArraySeq.java:  114  clojure.lang.ArraySeq/reduce
                  core.clj: 6946  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             protocols.clj:   49  clojure.core.protocols/iter-reduce
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   75  clojure.core.protocols/fn
             protocols.clj:   13  clojure.core.protocols/fn/G
                  core.clj: 6947  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1514  nextjournal.clerk.viewer$present_PLUS_paginate_children$fn__22893/invoke
                  core.clj: 7366  clojure.core/map-indexed/fn/fn
                  core.clj: 2894  clojure.core/take/fn/fn
                  core.clj: 2942  clojure.core/drop/fn/fn
             ArraySeq.java:  119  clojure.lang.ArraySeq/reduce
                  core.clj: 6946  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
               viewer.cljc: 1512  nextjournal.clerk.viewer$present_PLUS_paginate_children/invokeStatic
               viewer.cljc: 1503  nextjournal.clerk.viewer$present_PLUS_paginate_children/invoke
               viewer.cljc: 1577  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1659  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1651  nextjournal.clerk.viewer$present/invoke
                  core.clj: 2586  clojure.core/comp/fn
                  core.clj: 2759  clojure.core/map/fn/fn
                  core.clj: 7682  clojure.core/preserving-reduced/fn
     PersistentVector.java:  343  clojure.lang.PersistentVector/reduce
                  core.clj: 6885  clojure.core/reduce
                  core.clj: 7693  clojure.core/cat/fn
                  core.clj: 2759  clojure.core/map/fn/fn
     PersistentVector.java:  343  clojure.lang.PersistentVector/reduce
                  core.clj: 6946  clojure.core/transduce
                  core.clj: 6962  clojure.core/into
                  core.clj: 6950  clojure.core/into
                  core.clj: 2648  clojure.core/partial/fn
                  core.clj: 6231  clojure.core/update
                  core.clj: 6223  clojure.core/update
               viewer.cljc: 1190  nextjournal.clerk.viewer$process_blocks/invokeStatic
               viewer.cljc: 1186  nextjournal.clerk.viewer$process_blocks/invoke
                  core.clj: 2641  clojure.core/partial/fn
                  core.clj: 6231  clojure.core/update
                  core.clj: 6223  clojure.core/update
               viewer.cljc: 1219  nextjournal.clerk.viewer$fn__22802/invokeStatic
               viewer.cljc: 1217  nextjournal.clerk.viewer$fn__22802/invoke
               viewer.cljc: 1367  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1361  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1562  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1555  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1659  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1651  nextjournal.clerk.viewer$present/invoke
                  view.clj:   12  nextjournal.clerk.view/doc->viewer
                  view.clj:    8  nextjournal.clerk.view/doc->viewer
                  view.clj:    9  nextjournal.clerk.view/doc->viewer
                  view.clj:    8  nextjournal.clerk.view/doc->viewer
             webserver.clj:  122  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  121  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  137  nextjournal.clerk.webserver/update-doc!
             webserver.clj:  133  nextjournal.clerk.webserver/update-doc!
                 clerk.clj:   70  nextjournal.clerk/show!
                 clerk.clj:   21  nextjournal.clerk/show!
                 clerk.clj:   32  nextjournal.clerk/show!
                 clerk.clj:   21  nextjournal.clerk/show!
                      REPL:    1  notebooks.scratch/eval46374

I'm playing around with it. One issue is that my custom type doesn't implement clojure.lang.Counted

but is it seqable??

Looks like it could be a macro issue

Does clerk do anything special with def forms?

does it throw on (take 1 custom-type)?

Let me test... I got it to work by macroexpanding a macro that does a lot of def s and then deleting a line...

hmm, hard to follow from here…

does the custom type implement IDeref?

take works. It does implement deref

It may not be the custom type. I'm trying the same type but with simpler data and it's working.

I think your stacktrace points at it throwing in (#'clojure.core/deref-as-map your-custom-type)

(this is private)

Where do you see that in the stacktrace?

I think I've found the issue but I'm not sure why. I have a macro that expands to:

(do
  (def ...)
  (def ...)
  (do
    (def ...)
    (cleanup ...))
  ...)
When I macro expand and move everything out of the do block it works. Maybe do and def don't play well together?

I'm rendering a vega lite chart based on this https://vega.github.io/vega-lite/examples/layer_text_heatmap.html , it renders fine and I can download the PNG, but when I want to download the SVG, it crashes with Unhandled clojure.lang.ExceptionInfo 'nextjournal.clerk/show!' cannot show 'nil'. {:file-or-ns nil} Any idea what could be causing that?

Is it possible to disable caching on all forms in a notebook?

add it to the ns metadata:

(ns foo
  {:nextjournal.clerk/no-cache true})

yes, add no cache to the namespace metadata

Hmm I've tried the following but no luck

^{:nextjournal.clerk/no-cache true
  :nextjournal.clerk/visibility {:result :hide}}
(ns ...) 

But, it does work when I add that map entry to each individual forms metadata