簡體   English   中英

如何在clojure中設置和獲取多方法元數據?

[英]How to set and get multimethod metadata in clojure?

我正在使用多方法來解析命令行命令及其參數。

(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"))

沒有這種可能。 第一個原因(直截了當)是defmethod不提供為特定方法設置元數據的能力(只有defmulti允許,但僅限於整個多方法)。 第二個原因是 multimethod 本質上是一個單一的函數,只是有多個執行“變體”,每個“變體”都根據傳遞的參數觸發。 粗略地說,從調用者的角度來看,下面定義的函數f1f2之間沒有特別的區別:

(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 的每個方法,您應該考慮用普通函數替換每個方法,並且根本不要使用 multimethods。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM