假设我有一堆命名空间(比如apple、banana和orange)。在这些命名空间中,我使用了"eat"宏,该宏调用(而不是生成)"peel"函数。每种水果的"peel"函数都不同,但是宏是相同且相当庞大的,因此我想创建一个"fruit"命名空间,其中包含"eat"宏。但是,当我从"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)
强调一下,这意味着只有在宏被展开时才应该调用peel函数,就像这个例子。
(ns apple)
(defn peel [] (prn "peeled apple"))
(defmacro eat [] (peel))
(macroexpand-1 '(eat))
那么,如何将宏与多态结合起来呢?