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!
Hi Jeremy,
Hey @mkvlr
whoops, meant to type the reply before sending.
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.
re running multiple servers: also not quite supported out of the box as currently clerk relies uses global state quite a bit.
and for component libs the only things I’m aware of are https://github.com/mentat-collective#visual-math
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
@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.
@nam_nguyenhoai Perfect, that'll do. I love that the code is simple, making it more extensible.
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.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
can you get the stacktrace or put up a repro?
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.
this sounds like a dependency conflict
can you try to (require 'nextjournal.clerk.analyzer) at the repl?
and see if you get a more detailed error
is there more info on *e ?
@mkvlr thanks for the quick response. I am not seeing this issue if I go back to Clerk 0.12.707 and earlier.
When I do encounter the issue, (require 'nextjournal.clerk.analyzer) works as expected.
and what’s the error when you do (require 'nextjournal.clerk) ?
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...
#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꞉> This happens with a call to (clerk/show!...)
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]]}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...