Skip to content

Mixed string and keyword dispatch values break pprint pretty-printer #151

@vkz

Description

@vkz

Hi @camsaul appears mixing dispatch values like in the following examples break the default pretty-printer pprint. Typically, this shouldn't be a problem except when you store a multimethod in some compound data you pass around - like state of a finite state machine or something. The moment REPL attempts to pretty print such a value it'll throw an exception. Maybe related to problem with sort you mention in another issue.

Version: methodical/methodical {:mvn/version "1.0.111"}

To reproduce, try any of these:

Examples 1:

(defmulti boom (fn [arg] arg))
(defmethod boom :bar [_] :bar)
(pprint boom)
;; => works fine
(defmethod boom "bar" [_] "bar")
(pprint boom)
;; => with this method added throws
stacktrace
1. Unhandled java.lang.ClassCastException
   class clojure.lang.Keyword cannot be cast to class java.lang.String
   (clojure.lang.Keyword is in unnamed module of loader 'app';
   java.lang.String is in module java.base of loader 'bootstrap')

               String.java:  140  java.lang.String/compareTo
                 Util.java:  153  clojure.lang.Util/compare
    APersistentVector.java:  442  clojure.lang.APersistentVector/compareTo
                 Util.java:  153  clojure.lang.Util/compare
                  core.clj:  842  clojure.core/compare
                  core.clj:  833  clojure.core/compare
            AFunction.java:   51  clojure.lang.AFunction/compare
              TimSort.java:  355  java.util.TimSort/countRunAndMakeAscending
              TimSort.java:  220  java.util.TimSort/sort
               Arrays.java: 1233  java.util.Arrays/sort
                  core.clj: 3117  clojure.core/sort
                  core.clj: 3104  clojure.core/sort
                  core.clj: 3104  clojure.core/sort
              standard.clj:   20  methodical.impl.method-table.standard/dispatch-value-map
              standard.clj:   15  methodical.impl.method-table.standard/dispatch-value-map
              standard.clj:   34  methodical.impl.method-table.standard.StandardMethodTable/pretty
                  core.clj:   41  pretty.core/eval17673/fn
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
              dispatch.clj:   79  clojure.pprint/pprint-simple-list/fn
              dispatch.clj:   78  clojure.pprint/pprint-simple-list
              dispatch.clj:   88  clojure.pprint/pprint-list
              dispatch.clj:   87  clojure.pprint/pprint-list
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
           pprint_base.clj:  171  clojure.pprint/write-out
                  core.clj:   41  pretty.core/eval17673/fn
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
              dispatch.clj:   79  clojure.pprint/pprint-simple-list/fn
              dispatch.clj:   78  clojure.pprint/pprint-simple-list
              dispatch.clj:   88  clojure.pprint/pprint-list
              dispatch.clj:   87  clojure.pprint/pprint-list
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
           pprint_base.clj:  171  clojure.pprint/write-out
                  core.clj:   41  pretty.core/eval17673/fn
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
              dispatch.clj:   79  clojure.pprint/pprint-simple-list/fn
              dispatch.clj:   78  clojure.pprint/pprint-simple-list
              dispatch.clj:   88  clojure.pprint/pprint-list
              dispatch.clj:   87  clojure.pprint/pprint-list
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
           pprint_base.clj:  171  clojure.pprint/write-out
                  core.clj:   41  pretty.core/eval17673/fn
              MultiFn.java:  229  clojure.lang.MultiFn/invoke
           pprint_base.clj:  194  clojure.pprint/write-out
           pprint_base.clj:  249  clojure.pprint/pprint/fn
           pprint_base.clj:  248  clojure.pprint/pprint
           pprint_base.clj:  241  clojure.pprint/pprint
           pprint_base.clj:  245  clojure.pprint/pprint
           pprint_base.clj:  241  clojure.pprint/pprint

Example 2

(defmulti bam (fn [arg] arg))
(defmethod bam [:bar] [_] :bar)
(pprint bam)
;; => works fine
(defmethod bam ["bar"] [_] "bar")
(pprint bam)
;; => with this method added throws

Example 3

(defmulti foo first)
(defmethod foo "bar" [_] 42)
(defmethod foo ["bar"] [_] 42)
(pprint foo)

(defmulti baz first)
(defmethod baz :bar [_] 42)
(defmethod baz [:bar] [_] 42)
(pprint baz)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions