【发布时间】:2010-02-25 17:52:05
【问题描述】:
假设我有一堆命名空间(apple、banana、orange)。在这些命名空间中,我使用了eat 宏,它调用(不是“生成”,调用)peel 函数。 peel 函数对于每种水果都不同,但宏是相同的,而且相当大,所以我想创建一个包含 eat 宏的 fruit 命名空间。但是当我从apple 命名空间调用eat 宏时,eat 宏应该调用apple/peel 函数。
为了说明(但这不起作用):
(ns fruit)
(defmacro eat [] (peel))
(ns apple)
(defn peel [] (prn "peeled apple"))
(fruit/eat)
(ns banana)
(defn peel [] (prn "peeled banana"))
(fruit/eat)
强调一下,这意味着当且仅当宏展开时才应调用剥离函数,如本例所示。
(ns apple)
(defn peel [] (prn "peeled apple"))
(defmacro eat [] (peel))
(macroexpand-1 '(eat))
那么,关于如何结合宏和多态性有什么想法吗?
【问题讨论】: