Clojure 如何从multimethod中调用默认multimethod

Clojure 如何从multimethod中调用默认multimethod,clojure,Clojure,假设我有一个多重方法: (defmethod print-method MyObject [obj writer] (.write writer (format "%s %s" "prefix" (original-print-method-placeholder obj writer)) (def original-print-method-placeholder pri

假设我有一个多重方法:

(defmethod print-method MyObject [obj writer] 
    (.write writer (format "%s %s" 
                           "prefix" 
                           (original-print-method-placeholder obj writer))
(def original-print-method-placeholder print-method)

(defmulti print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
(defmethod print-method ...)
我想发出一些任意字符串,然后是如果我没有为此对象定义
print-method
的话会生成的原始字符串


那么,我如何用这个对象作为参数来调用“original”
print方法呢?

好的,从另一个答案中我看到,您可能指的是clojure.core/print-method(我以前不知道它存在)

您可能想查看此旧帖子:

别忘了阅读层次结构,以防它发挥作用:


更新 假设您想要打印一个关键字。
clojure.core\u print.clj
中的原始
打印方法是:

(defmethod print-method clojure.lang.Keyword [o, ^Writer w]
  (.write w (str o)))
也许只需复制并重命名源代码,将原始的
defmethod
替换为您自己的(无编写器):

是的,这很有效:

(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"

通常,您可以使用
(.getMethod print method:default)
来获取默认函数,这样您就可以调用它,尽管
clojure.core
print method
会调用自身,所以最终会导致堆栈溢出。它可能适用于其他多方法,具体取决于它们的实现


如果您想要
print方法
的默认情况,您可能会发现
print simple
已经足够接近您想要的了。(
print-method
的默认函数调用
print-simple

这是一个使用原始print方法的Java对象吗?在我的特定情况下,它实际上是一个
defrecord
。我想修改
defrecord
*print dup*
为真或假两种情况下的打印方式。在正常情况下,
pprint
只在括号内发出map值,不带类名。我想使用这个输出,因为它可以正确地断行,但是在它前面加上我自己的自定义版本的类名,即没有
#my.namespace.TheName{bla bla}
,我想在通过
pr
等写入控制台时保持相同。
(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"