仅加载多方法文件

时间:2014-02-18 13:10:01

标签: clojure multimethod

场景:我想使用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组。这似乎打败了使用多方法的目的,因为我仍然必须明确所有实现它的方法。

2 个答案:

答案 0 :(得分:0)

除非你愿意,否则你不必是明确的。如果它们被其他东西加载到另一个点,这些方法将起作用。如果我想向make-fruit添加方法,那么我必须自己加载该方法。此时,任何调用make-fruit的代码都会知道我的新方法。

答案 1 :(得分:0)

你可以尝试的是app / fruit / core.clj的底部:

(load "banana")
; Add other fruits here.

为了使其更灵活,您当然可以枚举所有文件,但遗憾的是,clojure.core/root-directory是私有的。