2011-09-26 32 views
1

只是希望重新因數一些簡單的代碼一個Clojure的結合問題

我有一個函數

(defn foo 
    ([x y] 
     (let [line [x y]] 
      (...)) 
    ([x y z] 
     (let [plane [x y z]] 
      (...)))) 

我知道我可以寫

(let [[x y :as point] [1 0]]) 

是否有類似的解構這種功能作爲foo在哪裏我可以寫 [x y :as line][x y z :as plane]在實際的defn? (即飛機將被分配[XYZ])

回答

2

您可以隨時使用宏建立let。這將使你兩個寫一樣的東西:

(def foo 
    (build-foo-args [[x y] line] 
    (...)) 
    (build-foo-args [[x y z] plane] 
    (...))) 

不知道有多少這樣的語法糖真的買你雖然...的讓是擺在首位非常清楚。

整體上,我可能會建議重新考慮你的函數簽名:

  • 如果你真的需要爲不同的arities然後 富或許應該被分成不同的功能不同的行爲。

  • 如果該行爲是不同的arities一樣的,那麼我會用 可變參數ARGS由戴維·雷的建議,但撥打結合 參數中性的東西例如「法向矢量」可以指多個維度。你可能會發現你實際上並不需要x,y,z來命名....

2

您可以在ARG列表解構爲好,但你必須使用可變參數ARGS這意味着你不能有多個簽名:

(defn foo [& [x y z :as plane]] 
    (...)) 

然後調用,如:

(foo 1 2 3) 

,但就像我上面說的,這種方法的兩個和三個ARG形式變得模糊,所以你得有各自的命名函數。

+0

多數民衆贊成在問題:)我想多個參數表格,我想我需要學習寫宏實施這個? – ChrisR