2016-11-23 103 views
3

我有一系列的功能,都做不同的事情,但傳遞相同的數據。假設我有以下參數向量。如何避免clojure中的重複函數參數?

[{:keys [x y vx vy x-min x-max y-min y-max] :or {x-min 0 x-max c-width y-min 0 y-max c-height}}] 

基本上你不想重複的東西的類型不止一次。我以爲有一個想法是做類似的事情。

(def func-args [x y z]) 
(defn func func-args (+ x y z)) 

然後我可以重新使用func-args,如果我有類似的功能。但是,前面示例的第一行引發了一個符號x無法解析的錯誤。

  • 有沒有辦法讓矢量成員作爲符號?
  • 有沒有比我建議的方法更加通俗的方法來完成函數參數代碼膨脹減少?
+0

如果綁定的矢量值,你」會避免你遇到的錯誤。 – jmargolisvt

+2

也許真正的問題在於,對於所有這些論點,你的功能太複雜了。 –

回答

2

這裏是做這件事的另一種方式,接受函數參數符合規範向量作爲參數傳遞給宏:

(defmacro defn-args 
    [fn-name fn-args & forms] 
    `(defn ~fn-name ~(eval fn-args) [email protected])) 

(def square-args '[x]) ; must quote [x] here 
(defn-args my-square square-args (* x x)) 

(my-square 3) 
;=> 9 
+0

這是一個非常簡潔的方法,只對所有情況使用一個宏。 –

5

引用矢量會使其符號未被評估,但defn需要定義中的文字矢量,因此這不會像您所建議的那樣工作。

最簡單的方法是創建一個宏。宏可以讓你創建自己的語法。在Clojure中,這種(放大)宏是不鼓勵的,因爲很容易遇到爲宏創建符號的問題。

喜歡的東西:

(def cheight 100) 
(def cwidth 100) 
(defmacro defx [name & body] 
    `(defn ~name [{:keys [~'x ~'y ~'vx ~'vy ~'x-min ~'x-max ~'y-min ~'y-max] 
       :or {~'x-min 0 ~'x-max ~'c-width ~'y-min 0 ~'y-max ~'c-height}}] 
    [email protected])) 

(defx func (+ x y)) 

(func {:x 1 :y 2}) ;; 3