clerk

Jeremy 2025-01-06T18:24:22.847209Z

Hi all, I'm hoping clerk for some data exploration; I'd greatly appreciate if someone can clarify these things for me 1. Is there some built-in functionality to debounce syncs? sliders can emit lots of events, esp. when you're trying to place it at a specific value. 2. Do :sync atoms stream full image or diffs? I'd like to know if it's safe to store ever-expanding lists in them, or to use it as a temp port for custom diffs. 3. Does clerk server support multiple notebooks at once? i.e. can I open 2 different notebook files in separate tabs. If not, can multiple servers be spun up from the same jvm process? 4. Where can I find list of component libs with clerk integration? I've seen one for Leva. This is not that important to me tho. Thanks!

mkvlr 2025-01-06T18:53:35.180979Z

Hi Jeremy,

Jeremy 2025-01-06T19:09:26.492309Z

Hey @mkvlr

mkvlr 2025-01-06T19:21:10.940319Z

whoops, meant to type the reply before sending.

😂 2
mkvlr 2025-01-06T19:23:45.066659Z

1. there’s currently not but I’ve also had the need for it 2. they send editscript diffs 3. currently only one notebook at a time, did some work around allowing more than one a while back but can’t say when I’ll get back to it.

👍 1
mkvlr 2025-01-06T19:24:15.475339Z

re running multiple servers: also not quite supported out of the box as currently clerk relies uses global state quite a bit.

mkvlr 2025-01-06T19:25:22.433359Z

and for component libs the only things I’m aware of are https://github.com/mentat-collective#visual-math

Jeremy 2025-01-06T19:40:48.620889Z

Thanks. The only bummer is the one notebook at a time limit, cause I'd have to incorporate more blocks into each notebook. But theoretically, Is it possible for me to implement some sort of sticky tab bar or notebook switcher at the top of the page? I'm more so asking if such a ui element is possible in clerk

Nguyen Hoai Nam 2025-01-07T07:23:52.404829Z

@olajeremy123 Maybe clerk-slideshow (https://github.com/nextjournal/clerk-slideshow)? It’s not quite a tab switcher, but if you only have two or three tabs I think it works well enough.

💜 1
🎉 1
Jeremy 2025-01-07T08:52:29.518899Z

@nam_nguyenhoai Perfect, that'll do. I love that the code is simple, making it more extensible.

🎉 1
2025-01-06T19:49:25.919219Z

Hi everyone, I am getting the following error trying to require Clerk (just following this example https://github.com/nextjournal/clerk?tab=readme-ov-file#-using-clerk):

; Syntax error compiling at (nextjournal/clerk.clj:1:1).
; namespace 'nextjournal.clerk.analyzer' not found
I am on Mac using Clojure 1.12.0, Clerk 0.17.1102, and OpenJDK 17. I have not come across this exact issue in https://github.com/nextjournal/clerk/issues?q=is%3Aissue+is%3Aopen+analyzer. I am trying different combos of Clojure and Clerk but no luck so far.

2025-01-08T22:04:45.830159Z

For what it is worth, I cloned the demos repo and can run those fine, following Usage instructions. https://github.com/nextjournal/clerk-demo/tree/main

mkvlr 2025-01-09T05:40:34.797999Z

can you get the stacktrace or put up a repro?

2025-01-06T20:00:42.198309Z

Does anyone have suggestions for what to look for as causes? I used Clerk quite a bit back with version 0.5 and now I am coming back to using it and hitting this basic import issue.

mkvlr 2025-01-06T20:03:32.801329Z

this sounds like a dependency conflict

mkvlr 2025-01-06T20:04:05.903879Z

can you try to (require 'nextjournal.clerk.analyzer) at the repl?

mkvlr 2025-01-06T20:04:29.273689Z

and see if you get a more detailed error

mkvlr 2025-01-06T20:13:40.170229Z

is there more info on *e ?

2025-01-06T21:18:41.907149Z

@mkvlr thanks for the quick response. I am not seeing this issue if I go back to Clerk 0.12.707 and earlier.

2025-01-06T21:19:31.662439Z

When I do encounter the issue, (require 'nextjournal.clerk.analyzer) works as expected.

mkvlr 2025-01-07T07:14:52.666589Z

and what’s the error when you do (require 'nextjournal.clerk) ?

2025-01-09T18:20:33.993389Z

Stacktrace for the invalid token error, when I run Clerk 0.12.707. I'll try to get the trace from the other error when trying to import 0.17.1102...

2025-01-09T18:20:43.614419Z

#error {
 :cause "Invalid token: :"
 :via
 [{:type java.lang.RuntimeException
   :message "Invalid token: :"
   :at [clojure.lang.Util runtimeException "Util.java" 221]}]
 :trace
 [[clojure.lang.Util runtimeException "Util.java" 221]
  [clojure.lang.LispReader interpretToken "LispReader.java" 414]
  [clojure.lang.LispReader read "LispReader.java" 307]
  [clojure.lang.LispReader read "LispReader.java" 218]
  [clojure.lang.LispReader read "LispReader.java" 207]
  [clojure.lang.RT readString "RT.java" 1896]
  [clojure.lang.RT readString "RT.java" 1891]
  [clojure.core$read_string invokeStatic "core.clj" 3841]
  [clojure.core$read_string invoke "core.clj" 3831]
  [nextjournal.clerk.viewer$roundtrippable_QMARK_ invokeStatic "viewer.cljc" 333]
  [nextjournal.clerk.viewer$roundtrippable_QMARK_ invoke "viewer.cljc" 332]
  [nextjournal.clerk.viewer$eval54046$fn__54047 invoke "viewer.cljc" 337]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$fn__7434 invokeStatic "core_print.clj" 225]
  [clojure.core$fn__7434 invoke "core_print.clj" 225]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$fn__7434 invokeStatic "core_print.clj" 225]
  [clojure.core$fn__7434 invoke "core_print.clj" 225]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$fn__7434 invokeStatic "core_print.clj" 225]
  [clojure.core$fn__7434 invoke "core_print.clj" 225]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$fn__7434 invokeStatic "core_print.clj" 225]
  [clojure.core$fn__7434 invoke "core_print.clj" 225]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr_on invoke "core.clj" 3694]
  [clojure.core$print_prefix_map$fn__7437 invoke "core_print.clj" 233]
  [clojure.core$print_sequential invokeStatic "core_print.clj" 66]
  [clojure.core$print_prefix_map invokeStatic "core_print.clj" 229]
  [clojure.core$print_map invokeStatic "core_print.clj" 238]
  [clojure.core$fn__7466 invokeStatic "core_print.clj" 266]
  [clojure.core$fn__7466 invoke "core_print.clj" 263]
  [clojure.lang.MultiFn invoke "MultiFn.java" 234]
  [clojure.core$pr_on invokeStatic "core.clj" 3700]
  [clojure.core$pr invokeStatic "core.clj" 3703]
  [clojure.core$pr invoke "core.clj" 3703]
  [clojure.lang.AFn applyToHelper "AFn.java" 154]
  [clojure.lang.RestFn applyTo "RestFn.java" 135]
  [clojure.core$apply invokeStatic "core.clj" 667]
  [clojure.core$pr_str invokeStatic "core.clj" 4785]
  [clojure.core$pr_str doInvoke "core.clj" 4785]
  [clojure.lang.RestFn invoke "RestFn.java" 411]
  [nextjournal.clerk.viewer$__GT_edn invokeStatic "viewer.cljc" 356]
  [nextjournal.clerk.viewer$__GT_edn invoke "viewer.cljc" 352]
  [nextjournal.clerk.webserver$broadcast_BANG_ invokeStatic "webserver.clj" 38]
  [nextjournal.clerk.webserver$broadcast_BANG_ invoke "webserver.clj" 33]
  [nextjournal.clerk.webserver$update_doc_BANG_ invokeStatic "webserver.clj" 167]
  [nextjournal.clerk.webserver$update_doc_BANG_ invoke "webserver.clj" 165]
  [nextjournal.clerk$show_BANG_ invokeStatic "clerk.clj" 60]
  [nextjournal.clerk$show_BANG_ invoke "clerk.clj" 23]
  [hello_engram.scratch$eval57115 invokeStatic "form-init15321638083135454860.clj" 13]
  [hello_engram.scratch$eval57115 invoke "form-init15321638083135454860.clj" 13]
  [clojure.lang.Compiler eval "Compiler.java" 7700]
  [clojure.lang.Compiler eval "Compiler.java" 7655]
  [clojure.core$eval invokeStatic "core.clj" 3232]
  [clojure.core$eval invoke "core.clj" 3228]
  [nrepl.middleware.interruptible_eval$evaluate$fn__38729$fn__38730 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" 667]
  [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1990]
  [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1990]
  [clojure.lang.RestFn invoke "RestFn.java" 428]
  [nrepl.middleware.interruptible_eval$evaluate$fn__38729 invoke "interruptible_eval.clj" 87]
  [clojure.main$repl$read_eval_print__9244$fn__9247 invoke "main.clj" 437]
  [clojure.main$repl$read_eval_print__9244 invoke "main.clj" 437]
  [clojure.main$repl$fn__9253 invoke "main.clj" 459]
  [clojure.main$repl invokeStatic "main.clj" 459]
  [clojure.main$repl doInvoke "main.clj" 368]
  [clojure.lang.RestFn invoke "RestFn.java" 1526]
  [nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 84]
  [nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 56]
  [nrepl.middleware.interruptible_eval$interruptible_eval$fn__38762$fn__38766 invoke "interruptible_eval.clj" 152]
  [clojure.lang.AFn run "AFn.java" 22]
  [nrepl.middleware.session$session_exec$main_loop__38832$fn__38836 invoke "session.clj" 218]
  [nrepl.middleware.session$session_exec$main_loop__38832 invoke "session.clj" 217]
  [clojure.lang.AFn run "AFn.java" 22]
  [java.lang.Thread run "Thread.java" 840]]}
clj꞉hello-engram.scratch꞉> 

2025-01-09T18:22:01.323859Z

This happens with a call to (clerk/show!...)

2025-01-09T18:28:03.557619Z

And this is the stacktrace before being able to call Clerk functions, triggered by the require

#error {
 :cause "namespace 'nextjournal.clerk.analyzer' not found"
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message "Syntax error compiling at (nextjournal/clerk.clj:1:1)."
   :data #:clojure.error{:phase :compile-syntax-check, :line 1, :column 1, :source "nextjournal/clerk.clj"}
   :at [clojure.core$throw_if invokeStatic "core.clj" 5920]}
  {:type java.lang.Exception
   :message "namespace 'nextjournal.clerk.analyzer' not found"
   :at [clojure.core$apply invokeStatic "core.clj" 669]}]
 :trace
 [[clojure.core$apply invokeStatic "core.clj" 669]
  [clojure.core$load_libs invokeStatic "core.clj" 6044]
  [clojure.core$load_libs doInvoke "core.clj" 6028]
  [clojure.lang.RestFn applyTo "RestFn.java" 140]
  [clojure.core$apply invokeStatic "core.clj" 669]
  [clojure.core$require invokeStatic "core.clj" 6066]
  [clojure.core$require doInvoke "core.clj" 6066]
  [clojure.lang.RestFn invoke "RestFn.java" 1292]
  [nextjournal.clerk$eval54469$loading__6812__auto____54470 invoke "clerk.clj" 1]
  [nextjournal.clerk$eval54469 invokeStatic "clerk.clj" 1]
  [nextjournal.clerk$eval54469 invoke "clerk.clj" 1]
  [clojure.lang.Compiler eval "Compiler.java" 7700]
  [clojure.lang.Compiler eval "Compiler.java" 7689]
  [clojure.lang.Compiler load "Compiler.java" 8165]
  [clojure.lang.RT loadResourceScript "RT.java" 401]
  [clojure.lang.RT loadResourceScript "RT.java" 392]
  [clojure.lang.RT load "RT.java" 479]
  [clojure.lang.RT load "RT.java" 444]
  [clojure.core$load$fn__6931 invoke "core.clj" 6189]
  [clojure.core$load invokeStatic "core.clj" 6188]
  [clojure.core$load doInvoke "core.clj" 6172]
  [clojure.lang.RestFn invoke "RestFn.java" 411]
  [clojure.core$load_one invokeStatic "core.clj" 5961]
  [clojure.core$load_one invoke "core.clj" 5956]
  [clojure.core$load_lib$fn__6873 invoke "core.clj" 6003]
  [clojure.core$load_lib invokeStatic "core.clj" 6002]
  [clojure.core$load_lib doInvoke "core.clj" 5981]
  [clojure.lang.RestFn applyTo "RestFn.java" 145]
  [clojure.core$apply invokeStatic "core.clj" 669]
  [clojure.core$load_libs invokeStatic "core.clj" 6044]
  [clojure.core$load_libs doInvoke "core.clj" 6028]
  [clojure.lang.RestFn applyTo "RestFn.java" 140]
  [clojure.core$apply invokeStatic "core.clj" 669]
  [clojure.core$require invokeStatic "core.clj" 6066]
  [clojure.core$require doInvoke "core.clj" 6066]
  [clojure.lang.RestFn invoke "RestFn.java" 515]
  [hello_engram.scratch$eval54461$loading__6812__auto____54462 invoke "form-init16065922272233145660.clj" 2]
  [hello_engram.scratch$eval54461 invokeStatic "form-init16065922272233145660.clj" 2]
  [hello_engram.scratch$eval54461 invoke "form-init16065922272233145660.clj" 2]
  [clojure.lang.Compiler eval "Compiler.java" 7700]
  [clojure.lang.Compiler eval "Compiler.java" 7689]
  [clojure.lang.Compiler eval "Compiler.java" 7655]
  [clojure.core$eval invokeStatic "core.clj" 3232]
  [clojure.core$eval invoke "core.clj" 3228]
  [nrepl.middleware.interruptible_eval$evaluate$fn__38729$fn__38730 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" 667]
  [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1990]
  [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1990]
  [clojure.lang.RestFn invoke "RestFn.java" 428]
  [nrepl.middleware.interruptible_eval$evaluate$fn__38729 invoke "interruptible_eval.clj" 87]
  [clojure.main$repl$read_eval_print__9244$fn__9247 invoke "main.clj" 437]
  [clojure.main$repl$read_eval_print__9244 invoke "main.clj" 437]
  [clojure.main$repl$fn__9253 invoke "main.clj" 459]
  [clojure.main$repl invokeStatic "main.clj" 459]
  [clojure.main$repl doInvoke "main.clj" 368]
  [clojure.lang.RestFn invoke "RestFn.java" 1526]
  [nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 84]
  [nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 56]
  [nrepl.middleware.interruptible_eval$interruptible_eval$fn__38762$fn__38766 invoke "interruptible_eval.clj" 152]
  [clojure.lang.AFn run "AFn.java" 22]
  [nrepl.middleware.session$session_exec$main_loop__38832$fn__38836 invoke "session.clj" 218]
  [nrepl.middleware.session$session_exec$main_loop__38832 invoke "session.clj" 217]
  [clojure.lang.AFn run "AFn.java" 22]
  [java.lang.Thread run "Thread.java" 840]]}

2025-01-08T00:39:19.530999Z

Sorry for the delay @mkvlr. If I do (require 'nextjournal.clerk.analyzer) I do not get an error. But when I do (require 'nextjournal.clerk) I get the

; Syntax error compiling at (nextjournal/clerk.clj:1:1).
; namespace 'nextjournal.clerk.analyzer' not found
error. So for now I am using Clerk 0.12.707, though hitting some other issues trying to render my notebook (the notebook pages renders with a big stack trace about
{:type java.lang.RuntimeException,
   :message "Invalid token: :",
   :at [clojure.lang.Util runtimeException "Util.java" 221]}]
I have been really impressed with Clerk and I like this style of literate programming much more than Jupyter notebooks (which I have used heavily in the past), just trying to use it again now and running into some issues...