我试图使用迪雷将钩子添加到多方法中。作者说这可能行不通。下面是一个正常函数的示例:
(ns mydire.prehook
(:require [dire.core :refer [with-pre-hook!]]))
(defn times [a b]
(* a b))
(with-pre-hook! #'times
"An optional docstring."
(fn [a b] (println "Logging something interesting.")))
(times 21 2) ; => "Logging something interesting."如您所见,with-pre-hook!被传递给(var times) (与#'times相同)。
问题是,当为multimethod调用var时,我得到了一个异常:clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol
有办法让这件事成功吗?
下面是我的代码示例:
(defmulti get-url identity)
(defmethod get-url :stackoverflow
[site]
"http://stackoverflow.com")
(with-pre-hook! (var (get-method get-url :stackoverflow))
(fn [x] (println "getting url for stackoverflow.")))发布于 2015-03-28 17:59:32
var是一个宏,它不计算它的参数。如果你给它一个列表,它不会计算这个列表,它会拒绝它,因为它是一个列表,而不是一个符号。
由于defmethod没有创建变量,所以没有可以使用特定方法附加的var,因此它修改了附加到的multimethod的分派。get-method返回的值是一个函数,而不是变量。
在查看了dire之后,它特别需要一个var来操作,如果没有重新设计,它就不会在multimethod的特定方法上工作。因此,不能在特定的方法上使用with-pre-hook,尽管它可能对multimethod本身起作用(包括它的所有方法)。
https://stackoverflow.com/questions/29318813
复制相似问题