clerk

2025-09-19T13:24:01.605589Z

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

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

2025-09-19T13:24:49.634159Z

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

mkvlr 2025-09-19T16:10:19.298779Z

it is a viewer

mkvlr 2025-09-19T16:14:17.684359Z

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

mkvlr 2025-09-19T16:14:23.190449Z

would you mind filing an issue?

👍 1
2025-09-22T07:10:15.124809Z

I will!

2025-09-22T07:13:33.864369Z

done https://github.com/nextjournal/clerk/issues/770

🙏 1
borkdude 2025-09-22T09:14:30.619579Z

@mkvlr I can have a look if you want

❤️ 1
mkvlr 2025-09-22T09:14:53.211959Z

@borkdude sure, please do

borkdude 2025-09-22T10:15:09.592509Z

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]

2025-09-22T10:37:39.291169Z

^{::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

2025-09-22T10:38:12.603439Z

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

borkdude 2025-09-22T10:38:13.086169Z

yep. but when you use

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

2025-09-22T10:38:45.234369Z

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

2025-09-22T10:38:47.648749Z

is fine tho

borkdude 2025-09-22T10:39:45.451519Z

ah ok

2025-09-22T10:39:51.116359Z

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

borkdude 2025-09-22T10:39:52.083059Z

that's... special :)

borkdude 2025-09-22T10:40:07.387219Z

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

2025-09-22T10:41:45.472209Z

thx