场景:我想使用multimethods在多个文件中分派和传播功能。其中一个文件只包含多个方法,为了使它们可用,我必须手动加载文件。有没有办法自动加载文件,而不是显式加载它?
这是我正在做的一个简单例子:
; app/core.clj
(ns app.core
(:use [app.fruit.core :only [make-fruit]])
(println (:name (make-fruit :banana)))
; app/fruit/core.clj
(ns app.fruit.core)
(defmulti make-fruit identity)
; app/fruit/banana.clj
(ns app.fruit.banana
(:use [app.fruit.core :only [make-fruit]])
(defmethod make-fruit :banana [fruit]
{:name "banana" :color "yellow})
除非我在app.core中显式加载,否则不会加载fruit.banana的方法,比如将它添加到:use组。这似乎打败了使用多方法的目的,因为我仍然必须明确所有实现它的方法。
答案 0 :(得分:0)
除非你愿意,否则你不必是明确的。如果它们被其他东西加载到另一个点,这些方法将起作用。如果我想向make-fruit
添加方法,那么我必须自己加载该方法。此时,任何调用make-fruit
的代码都会知道我的新方法。
答案 1 :(得分:0)
你可以尝试的是app / fruit / core.clj的底部:
(load "banana")
; Add other fruits here.
为了使其更灵活,您当然可以枚举所有文件,但遗憾的是,clojure.core/root-directory
是私有的。