2014-02-18 6 views
3

시나리오 : 멀티 파일을 사용하여 여러 파일에 기능을 디스패치하고 보급하려고합니다. 파일 중 하나는 멀티 메소드 만 포함하고 사용할 수 있도록 수동으로 파일을로드해야합니다. 명시 적으로로드하는 대신 파일을 자동으로로드하는 방법이 있습니까?멀티 메소드 파일 만로드

여기에 내가 뭘하는지의 간단한 예제 : 사용 그룹 : 내가 명시 적으로 추가하는 등, app.core에로드하지 않는

; 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의 방법은로드되지 않습니다. 이 방법을 구현하는 모든 방법에 대해 명시해야하기 때문에 멀티 메소드 사용의 목적을 무력화시키는 것 같습니다.

+0

와일드 카드 네임 스페이스가 허용 된 경우 이는 사소한 것입니다. 이 스레드를 따르십시오 http://stackoverflow.com/q/1990714/1552130 – KobbyPemson

답변

0

원하는 경우를 제외하고는 명시적일 필요가 없습니다. 다른 점에서 다른 방법으로로드 된 경우 메서드가 작동합니다. make-fruit에 메서드를 추가하려면 해당 메서드를 직접로드해야합니다. 이 시점에서 make-fruit을 호출하는 모든 코드는 새 메서드를 인식합니다.

+0

나는 그 정도 이해하지만 내 문제는 파일의 다른 어떤 것도로드되지 않는다는 것입니다. 멀티 메소드 구현으로 만 구성됩니다. 그래서 어떤 점에서 나는 메소드를 사용할 수 있도록 명시 적으로로드해야합니다. 그것을 피할 수 없다면, 어쨌든 내가 명시 적 이어야만한다면 제네릭 형식 대신에 make-banana와 같은 함수를 사용하는 것을 고려해 볼 수 있습니다. – xen

0

당신이 시도 할 수있는 것은이 응용 프로그램/과일/core.clj의 맨 아래에 있습니다 :

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

이 좀 더 유연하게하려면, 슬프게도, clojure.core/root-directory 개인하지만 당신은 물론 모든 파일을 열거 할 수 있습니다.