2016-09-17 3 views
1

저는 multimethods를 사용하여 명령 줄 명령과 해당 인수를 구문 분석합니다. 나는 메타 데이터에 액세스하려고하면클로저에 멀티 메소드 메타 데이터를 설정하고 가져 오는 방법은 무엇입니까?

(defmulti run (fn [command args] command)) 

(defmethod run :default 
    [& _] 
    ...) 

^{:args "[command]"} 
(defmethod run "help" 
    [_ & [args]] 
    "Display command list or help for a given command" 
    ...) 

^{:args ""} 
(defmethod run "version" 
    [_ & [args]] 
    "Print program's version" 
    ...) 

(defn -main 
    [& args] 
    (run (first args) 
    (next args))) 

은 특정 방법에 대한 Clojure의는 nil 반환

(meta ((methods run) "help")) 

답변

3

그런 가능성이 없다. 첫 번째 이유는 (직접적인 것) defmethod은 특정 방법에 대한 메타 데이터를 설정할 수있는 기능을 제공하지 않는다는 것입니다 (defmulti 만 허용됨, 그러나 전체 멀티 메소드에만 해당). 두 번째 이유는 다중 메소드가 본질적으로 하나의 함수이고, 여러 개의 "변형"실행 만있는 것입니다. 각 매개 변수는 전달 된 매개 변수에 따라 실행됩니다.

(defmulti f1 (fn [x] x)) 

(defmethod f1 :foo [x] 
    ...) 

(defmethod f1 :bar [x] 
    ...) 

(defmethod f1 :baz [x] 
    ...) 

(defn f2 [x] 
    (case x 
    :foo ... 
    :bar ... 
    :baz ...)) 

개인적으로, 나는 특정 기능이 구현 세부 정보에 의존하는 등 multimethod 또는 일반적인 기능 여부에 따라 생각 하는데요 : Rougly보기의 호출 지점에서, 말하기, 아래에 정의 된 기능 f1f2 사이에 특별한 차이가 없습니다. 또한 multimehod의 각 메서드를 명시 적으로 문서화해야하는 경우 각 메서드를 일반 함수로 바꾸고 multimethod를 전혀 사용하지 않는 것이 좋습니다.