2011-09-26 44 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