ОК, поэтому из другого ответа я вижу, что вы, вероятно, имеете в виду clojure.core / print-method (я не знал, что существовало до этого).
Вы можете проверить это старое сообщение:
и не забудьте прочитать об иерархиях в случае, если они вступают в игру:
Обновление
Предположим, вы хотите напечатать ключевое слово. Оригинал print-method
в clojure.core_print.clj
:
(defmethod print-method clojure.lang.Keyword [o, ^Writer w]
(.write w (str o)))
возможно, просто скопируйте и переименуйте источник, заменив оригинал defmethod
своим собственным ( без Writer):
(defn print-method-kw [o]
(str o))
(defmethod print-method clojure.lang.Keyword [o, w]
(.write w (str "<kw " (print-method-kw o) " />")))
(println "look:")
(println :hello)
Результаты:
look:
<kw :hello />
Старый ответ на общие функции:
Просто запишите функцию перед определением мультиметода:
(def original-print-method-placeholder print-method)
(defmulti print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
Да, это работает:
(defn greeting [x] (str "Nice day, " x ))
(greeting "you") => "Nice day, you"
но позже в файле мы переопределим его:
(def orig-greeting greeting) ; capture a reference to the function
(defmulti greeting (fn [lang & args] lang))
(defmethod greeting :english [lang person]
(str "(English accent) " (orig-greeting person)))
(defmethod greeting :french [lang person]
(str "(French accent) " (orig-greeting person)))
(greeting :english "you") => "(English accent) Nice day, you"
(greeting :french "you") => "(French accent) Nice day, you"