2016-02-18 37 views
1

是否有内置的方法只将第n个参数传递给另一个函数。考虑这个问题:只传递第n个参数

(defn nth-arg [i & args] 
    (nth args i)) 

和方便:

(def arg1 (partial nth-arg 0)) 
(def arg2 (partial nth-arg 1)) 
(def arg3 (partial nth-arg 2)) 

这将使得能够避免同样的结构(FN [_ _ X](富X)):

(comp foo arg3) 
+2

你能举一个实际功能的例子吗? –

+0

实际上,我通过后面的代码碰到了这个问题,你只是回答了这个问题:http://stackoverflow.com/questions/35470950/getting-the-positions-of-the-occurrences-of-one-item-in- a-sequence/35471392?noredirect = 1#comment58638472_35471392 –

+2

在传递给'filter'的匿名函数中,实际上是解构一个向量,*不是*取第二个参数。你可以将它改写为'(comp(partial = item)second)'。 –

回答

1

无只接受将在你的函数中使用的参数是很好的风格。如果您认为便于接受更多信息,请考虑转换输入。保持函数应用程序和数据选择之间的区别是件好事。

有时你会被迫创建不使用第一个参数的函数,例如在定义协议时,通常不需要参数this,所以你只是放弃它。在这里,最好是明确并直接了解正在发生的事情。你不会通过委托给另一个函数来使代码更优雅,这是读者遵循的另一个精神步骤。

避免vardic行为,当它不利于你。你正在牺牲一个真正的好处(合格检查)。它打开你难以推理的错误(opps我应该应用该向量,而不是传递!当我重构了4个参数,而不是3后,不需要第二个参数)。