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"