clerk 2025-09-19

I thought clerk/row was just another viewer. Should the following code work?

^{::clerk/viewer clerk/row}
(def foo 1)

I get an exception with this stack trace:

1. Unhandled java.lang.NullPointerException
   Cannot invoke "java.util.concurrent.Future.get()" because "fut" is
   null
                  core.clj: 2317  clojure.core/deref-future
                  core.clj: 2337  clojure.core/deref
                  core.clj: 2323  clojure.core/deref
                  core.clj: 2586  clojure.core/comp/fn
                  core.clj: 7645  clojure.core/some-fn/sp2
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
                  AFn.java:  160  clojure.lang.AFn/applyToHelper
               RestFn.java:  135  clojure.lang.RestFn/applyTo
                  core.clj:  673  clojure.core/apply
                  core.clj:  662  clojure.core/apply
               viewer.cljc:  422  nextjournal.clerk.viewer$update_val$fn__12135/invoke
               viewer.cljc:  450  nextjournal.clerk.viewer$apply_viewer_unwrapping_var_from_def/invokeStatic
               viewer.cljc:  439  nextjournal.clerk.viewer$apply_viewer_unwrapping_var_from_def/invoke
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc:  638  nextjournal.clerk.viewer$update_if/invokeStatic
               viewer.cljc:  638  nextjournal.clerk.viewer$update_if/invoke
               viewer.cljc:  668  nextjournal.clerk.viewer$cell__GT_result_viewer/invokeStatic
               viewer.cljc:  666  nextjournal.clerk.viewer$cell__GT_result_viewer/invoke
               viewer.cljc:  681  nextjournal.clerk.viewer$transform_cell/invokeStatic
               viewer.cljc:  675  nextjournal.clerk.viewer$transform_cell/invoke
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
                  AFn.java:  160  clojure.lang.AFn/applyToHelper
               RestFn.java:  135  clojure.lang.RestFn/applyTo
                  core.clj:  673  clojure.core/apply
                  core.clj:  662  clojure.core/apply
               viewer.cljc:  422  nextjournal.clerk.viewer$update_val$fn__12135/invoke
               viewer.cljc: 1500  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1492  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1710  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1703  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1808  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1800  nextjournal.clerk.viewer$present/invoke
                  core.clj: 2586  clojure.core/comp/fn
                  core.clj: 2759  clojure.core/map/fn/fn
                  core.clj: 7806  clojure.core/preserving-reduced/fn
     PersistentVector.java:  418  clojure.lang.PersistentVector/reduce
                  core.clj: 6964  clojure.core/reduce
                  core.clj: 7817  clojure.core/cat/fn
                  core.clj: 2759  clojure.core/map/fn/fn
     PersistentVector.java:  418  clojure.lang.PersistentVector/reduce
                  core.clj: 7025  clojure.core/transduce
                  core.clj: 7042  clojure.core/into
                  core.clj: 7029  clojure.core/into
                  core.clj: 2648  clojure.core/partial/fn
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc: 1307  nextjournal.clerk.viewer$process_blocks/invokeStatic
               viewer.cljc: 1303  nextjournal.clerk.viewer$process_blocks/invoke
                  core.clj: 2641  clojure.core/partial/fn
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc: 1336  nextjournal.clerk.viewer$fn__12472/invokeStatic
               viewer.cljc: 1334  nextjournal.clerk.viewer$fn__12472/invoke
               viewer.cljc: 1500  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1492  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1710  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1703  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1808  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1800  nextjournal.clerk.viewer$present/invoke
                  view.clj:   13  nextjournal.clerk.view/doc->viewer
                  view.clj:    9  nextjournal.clerk.view/doc->viewer
                  view.clj:   10  nextjournal.clerk.view/doc->viewer
                  view.clj:    9  nextjournal.clerk.view/doc->viewer
             webserver.clj:  149  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  148  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  162  nextjournal.clerk.webserver/update-doc!
             webserver.clj:  160  nextjournal.clerk.webserver/update-doc!
                 clerk.clj:   76  nextjournal.clerk/show!
                 clerk.clj:   22  nextjournal.clerk/show!
                 clerk.clj:   35  nextjournal.clerk/show!
                 clerk.clj:   22  nextjournal.clerk/show!
                      REPL:    1  data-prep.blade-2025/eval70213

it is a viewer

seems to be some interaction with the viewer to show the value of the var

would you mind filing an issue?

👍 1

@mkvlr I can have a look if you want

❤️ 1

there's two issues here right? the first one being that a row should be a sequence of things, not just one thing?

^{::clerk/viewer clerk/row}
[1 2 3]

^{::clerk/viewer clerk/row}
(def foo [0 1 2])
1. Unhandled java.lang.NullPointerException
   Cannot invoke "java.util.concurrent.Future.get()" because "fut" is
   null
                  core.clj: 2317  clojure.core/deref-future
                  core.clj: 2337  clojure.core/deref
                  core.clj: 2323  clojure.core/deref
                  core.clj: 2586  clojure.core/comp/fn
                  core.clj: 7645  clojure.core/some-fn/sp2
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
                  AFn.java:  160  clojure.lang.AFn/applyToHelper
               RestFn.java:  135  clojure.lang.RestFn/applyTo
                  core.clj:  673  clojure.core/apply
                  core.clj:  662  clojure.core/apply
               viewer.cljc:  422  nextjournal.clerk.viewer$update_val$fn__12135/invoke
               viewer.cljc:  450  nextjournal.clerk.viewer$apply_viewer_unwrapping_var_from_def/invokeStatic
               viewer.cljc:  439  nextjournal.clerk.viewer$apply_viewer_unwrapping_var_from_def/invoke
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc:  638  nextjournal.clerk.viewer$update_if/invokeStatic
               viewer.cljc:  638  nextjournal.clerk.viewer$update_if/invoke
               viewer.cljc:  668  nextjournal.clerk.viewer$cell__GT_result_viewer/invokeStatic
               viewer.cljc:  666  nextjournal.clerk.viewer$cell__GT_result_viewer/invoke
               viewer.cljc:  681  nextjournal.clerk.viewer$transform_cell/invokeStatic
               viewer.cljc:  675  nextjournal.clerk.viewer$transform_cell/invoke
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
                  AFn.java:  160  clojure.lang.AFn/applyToHelper
               RestFn.java:  135  clojure.lang.RestFn/applyTo
                  core.clj:  673  clojure.core/apply
                  core.clj:  662  clojure.core/apply
               viewer.cljc:  422  nextjournal.clerk.viewer$update_val$fn__12135/invoke
               viewer.cljc: 1500  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1492  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1710  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1703  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1808  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1800  nextjournal.clerk.viewer$present/invoke
                  core.clj: 2586  clojure.core/comp/fn
                  core.clj: 2759  clojure.core/map/fn/fn
                  core.clj: 7806  clojure.core/preserving-reduced/fn
     PersistentVector.java:  418  clojure.lang.PersistentVector/reduce
                  core.clj: 6964  clojure.core/reduce
                  core.clj: 7817  clojure.core/cat/fn
                  core.clj: 2759  clojure.core/map/fn/fn
     PersistentVector.java:  418  clojure.lang.PersistentVector/reduce
                  core.clj: 7025  clojure.core/transduce
                  core.clj: 7042  clojure.core/into
                  core.clj: 7029  clojure.core/into
                  core.clj: 2648  clojure.core/partial/fn
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc: 1307  nextjournal.clerk.viewer$process_blocks/invokeStatic
               viewer.cljc: 1303  nextjournal.clerk.viewer$process_blocks/invoke
                  core.clj: 2641  clojure.core/partial/fn
                  core.clj: 6259  clojure.core/update
                  core.clj: 6251  clojure.core/update
               viewer.cljc: 1336  nextjournal.clerk.viewer$fn__12472/invokeStatic
               viewer.cljc: 1334  nextjournal.clerk.viewer$fn__12472/invoke
               viewer.cljc: 1500  nextjournal.clerk.viewer$apply_viewers_STAR_/invokeStatic
               viewer.cljc: 1492  nextjournal.clerk.viewer$apply_viewers_STAR_/invoke
               viewer.cljc: 1710  nextjournal.clerk.viewer$present_STAR_/invokeStatic
               viewer.cljc: 1703  nextjournal.clerk.viewer$present_STAR_/invoke
               viewer.cljc: 1808  nextjournal.clerk.viewer$present/invokeStatic
               viewer.cljc: 1800  nextjournal.clerk.viewer$present/invoke
                  view.clj:   13  nextjournal.clerk.view/doc->viewer
                  view.clj:    9  nextjournal.clerk.view/doc->viewer
                  view.clj:   10  nextjournal.clerk.view/doc->viewer
                  view.clj:    9  nextjournal.clerk.view/doc->viewer
             webserver.clj:  149  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  148  nextjournal.clerk.webserver/present+reset!
             webserver.clj:  162  nextjournal.clerk.webserver/update-doc!
             webserver.clj:  160  nextjournal.clerk.webserver/update-doc!
                 clerk.clj:   76  nextjournal.clerk/show!
                 clerk.clj:   22  nextjournal.clerk/show!
                 clerk.clj:   35  nextjournal.clerk/show!
                 clerk.clj:   22  nextjournal.clerk/show!
                      REPL:    1  data-prep.census-and-transitions/eval71504

I'm only really getting it when I do a def

yep. but when you use

^{::clerk/viewer clerk/row}
1
it'll also fail, I mean

^{::clerk/viewer clerk/row}
((constantly 0))

I don't get where the deref-future is coming from in the stack trace

that's... special :)

yeah I'll give it a look now. I'll focus just on the var case