首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得multimethod的var?

如何获得multimethod的var?
EN

Stack Overflow用户
提问于 2015-03-28 15:18:31
回答 1查看 131关注 0票数 2

我试图使用迪雷将钩子添加到多方法中。作者说这可能行不通。下面是一个正常函数的示例:

代码语言:javascript
复制
(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

有办法让这件事成功吗?

下面是我的代码示例:

代码语言:javascript
复制
(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.")))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-28 17:59:32

var是一个宏,它不计算它的参数。如果你给它一个列表,它不会计算这个列表,它会拒绝它,因为它是一个列表,而不是一个符号。

由于defmethod没有创建变量,所以没有可以使用特定方法附加的var,因此它修改了附加到的multimethod的分派。get-method返回的值是一个函数,而不是变量。

在查看了dire之后,它特别需要一个var来操作,如果没有重新设计,它就不会在multimethod的特定方法上工作。因此,不能在特定的方法上使用with-pre-hook,尽管它可能对multimethod本身起作用(包括它的所有方法)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29318813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档