2014-02-18 63 views
3

方案:我想使用多方法在多個文件中調度和傳播功能。其中一個文件只包含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}) 

fruit.banana的方法不加載,除非我明確地加載它在app.core,喜歡它增加了:使用組。這似乎打敗了使用multimethod的目的,因爲我仍然必須明確實現它的所有方法。

+0

如果通配名稱空間被允許,那麼這將是微不足道的。按照這個線程http://stackoverflow.com/q/1990714/1552130 – KobbyPemson

回答

0

除非你想要,否則你不需要明確。如果這些方法在別的地方被加載到另一個地方,這些方法將起作用。如果我想添加一個方法到make-fruit,那麼我將不得不自己加載該方法。那時,任何調用make-fruit的代碼都會意識到我的新方法。

+0

我想我很明白,但我的問題是沒有其他文件正在加載;它只包含multimethod實現。所以在某些時候我必須明確加載它,以便方法可用。如果無法避免,我可能會考慮使用像make-banana這樣的函數,而不是泛型,如果我必須明確的話。 – xen

0

什麼你可以嘗試,這是在應用程序/水果/ core.clj的底部:

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

爲了使其更加靈活,當然你可以列舉所有的文件,雖然很遺憾,clojure.core/root-directory是私人的。