clerk

Zach 2024-10-02T11:52:40.575639Z

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?

mkvlr 2024-10-02T13:34:11.179719Z

can you paste a stacktrace?

Zach 2024-10-02T13:38:02.861159Z

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

Zach 2024-10-02T15:16:27.358419Z

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

mkvlr 2024-10-02T15:18:06.896769Z

but is it seqable??

Zach 2024-10-02T15:19:32.452789Z

Yeah

Zach 2024-10-02T15:20:22.120319Z

Looks like it could be a macro issue

Zach 2024-10-02T15:20:32.170589Z

Does clerk do anything special with def forms?

mkvlr 2024-10-02T15:21:44.962089Z

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

Zach 2024-10-02T15:23:05.743349Z

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

mkvlr 2024-10-02T15:23:58.292259Z

hmm, hard to follow from here…

mkvlr 2024-10-02T15:24:41.521849Z

does the custom type implement IDeref?

Zach 2024-10-02T15:25:01.479099Z

take works. It does implement deref

Zach 2024-10-02T15:25:35.764369Z

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

mkvlr 2024-10-02T15:26:27.746369Z

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

mkvlr 2024-10-02T15:26:31.848429Z

(this is private)

Zach 2024-10-02T15:28:50.647659Z

Where do you see that in the stacktrace?

Zach 2024-10-02T15:31:01.282679Z

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?

2024-10-02T13:37:36.994119Z

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?

Zach 2024-10-02T17:56:33.835889Z

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

mkvlr 2024-10-03T07:13:57.942519Z

add it to the ns metadata:

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

mkvlr 2024-10-02T18:06:48.504959Z

yes, add no cache to the namespace metadata

Zach 2024-10-03T05:27:05.251949Z

Hmm I've tried the following but no luck

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

Zach 2024-10-03T05:32:36.140389Z

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