babashka / sci

Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
Eclipse Public License 1.0
1.21k stars 86 forks source link

simple-dispatch extended to protocol not effective #750

Open borkdude opened 2 years ago

borkdude commented 2 years ago

Repro:

(ns user
  (:require [clojure.pprint :as pprint]))

(defprotocol Schema)
(defrecord ASchema []
  Schema)

(defrecord Foo [x])

(defmethod clojure.pprint/simple-dispatch user.Schema [_] (println "PRETTY"))

(prefer-method clojure.pprint/simple-dispatch user.Schema clojure.lang.IRecord)
(prefer-method clojure.pprint/simple-dispatch user.Schema java.util.Map)
(prefer-method clojure.pprint/simple-dispatch user.Schema clojure.lang.IPersistentMap)

(clojure.pprint/pprint (ASchema.))

This should print "PRETTY".

cc @frenchy64

frenchy64 commented 2 years ago

I'm guessing the most general fix for this is in clojure.core/isa?. Also worth testing print-method.

./bb
Babashka v0.8.3-SNAPSHOT REPL.
Use :repl/quit or :repl/exit to quit the REPL.
Clojure rocks, Bash reaches.

user=> (defprotocol P) (defrecord R [] P)
#'user/P
user=> user.R
user=> (isa? user.R user.P)
false
clj
Clojure 1.11.1
user=> (defprotocol P) (defrecord R [] P)

P
user.R
user=> (isa? user.R user.P)
true