Вы можете использовать мультиметоды для отправки,
(derive ::subtype ::type)
, затем вы можете отправлять на основе типа
(defmulti my-method
(fn [type] ((meta type) :type)))
(defmethod my-method ::subtype []
;;stuff...
)
. Вам необходимо добавить: type к метаданным объектов при его создании,
(with-meta [1 2 3] {:type ::subtype})
или я не пробовал этого, но поскольку протоколы и записи создают Java-классы за кулисами, которые вы отправляете на основе этого имени.