Fork me on GitHub
#babashka
<
2022-12-27
>
teodorlu21:12:39

I'm running into some surprising behavior with babashka.process/process and cider-pprint-eval-last-sexp, details in thread.

teodorlu21:12:57

Here's my code:

(->
   (babashka.process/process ["cat"]
                             {:in "Good morning"
                              :out :string})
   deref)
If I evaluate this normally (`C-c C-c`), it works as I'd expect.

teodorlu21:12:12

However, if I M-x cider-pprint-eval-last-sexp, I get the following:

2. Unhandled clojure.lang.ExceptionInfo
   (No message)
   #:clojure.error{:phase :print-eval-result}
                  main.clj:  442  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  218  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  217  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java: 1589  java.lang.Thread/run

1. Caused by java.lang.IllegalArgumentException
   Multiple methods in multimethod 'simple-dispatch' match dispatch value: class
   babashka.process.Process -> interface clojure.lang.IPersistentMap and
   interface clojure.lang.IDeref, and neither is preferred

              MultiFn.java:  179  clojure.lang.MultiFn/findAndCacheBestMethod
              MultiFn.java:  150  clojure.lang.MultiFn/getMethod
              MultiFn.java:  154  clojure.lang.MultiFn/getFn
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
           pprint_base.clj:  233  clojure.pprint/write/fn
           pprint_base.clj:  233  clojure.pprint/write
           pprint_base.clj:  197  clojure.pprint/write
               RestFn.java:  139  clojure.lang.RestFn/applyTo
                  core.clj:  669  clojure.core/apply
                  core.clj:  662  clojure.core/apply
                pprint.clj:   47  cider.nrepl.pprint/pprint
                pprint.clj:   42  cider.nrepl.pprint/pprint
                  Var.java:  393  clojure.lang.Var/invoke
                 print.clj:  224  nrepl.middleware.print/wrap-print/fn/print
                 print.clj:  130  nrepl.middleware.print/send-streamed/print-key
                  core.clj: 7783  clojure.core/run!/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: 6886  clojure.core/reduce
                  core.clj: 7778  clojure.core/run!
                  core.clj: 7778  clojure.core/run!
                 print.clj:  135  nrepl.middleware.print/send-streamed
                 print.clj:  122  nrepl.middleware.print/send-streamed
                 print.clj:  173  nrepl.middleware.print/printing-transport/reify
                caught.clj:   58  nrepl.middleware.caught/caught-transport/reify
    interruptible_eval.clj:  123  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  442  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  218  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  217  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java: 1589  java.lang.Thread/run

teodorlu21:12:21

$ (emacs-version)
GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6)
 of 2022-09-12
$ (doom/version)
GNU Emacs     v28.2            nil
Doom core     v3.0.0-pre       HEAD -> master d5ccac5d 2022-12-02 00:36:06 +0100
Doom modules  v22.10.0-pre     HEAD -> master d5ccac5d 2022-12-02 00:36:06 +0100
$ (cider-version)
CIDER 1.5.0 (Strasbourg)

teodorlu21:12:43

Happy to provide more details if that's helpful!

teodorlu21:12:40

That explains it. Requiring babashka.process.pprint gives me a nice pretty-printed output. Thank you!

borkdude21:12:46

I think we could maybe auto-load this namespace if clojure.pprint is already loaded. I'd like to avoid loading clojure.pprint if it's not used since it it drags in some stuff that bloats graalvm binaries. It would in my opinion be useful to be able to define a pprint method without dragging in pprint itself, e.g. via metadata. Not sure if this has ever been considered.

1
borkdude21:12:27

I pushed this autoload commit, so I think if you use babashka.process from master, it should work without anything else now

borkdude21:12:45

pushed as mvn version 0.4.14

👀 1
teodorlu21:12:56

can confirm that it "just works" on babashka/process {:mvn/version "0.4.14"}! (`neil dep upgrade` 😁)

clojure-spin 1