11

不要な引数を無視する簡単な方法はありますか?

例: (#(+ %1 %2) 1 2)3を返します

このコードを強制したい

(#(+ %1 %2) 1 2 3)

3も返します。しかし、それは戻ります

java.lang.IllegalArgumentException:渡された引数の数(3)が間違っています。

変更する方法は#(+ %1 %2)

よりエレガントな方法があるといいのですが#(+ (nth %& 0) (nth %& 1))

4

4 に答える 4

18

これが私が行くものです:

=> ((fn [a b & _] (+ a b)) 1 2 3)
=> 3

これにより、任意の数の引数を取る匿名関数が作成されますが、最初の2つが追加されます。シンボルは特別なことは何もしていません。_「私はこのことを気にしませんが、どういうわけかそれをバインドする必要があります」という慣用句です。あなたがこれをたくさんやろうとしていると思うなら、あなたはおそらくそれを定義したいと思うでしょう:

(defn add-first-two
  [a b & _]
  (+ a b))

#()構文に本当に興味がある場合は%&、任意の数の引数を取る必要があることを「実現」するために、定義のどこかに含める必要があります。表示するときにインデックスを作成する必要があるという意味ではなく、どこかに存在する必要があるだけです。次に例を示します。

=> (#(do %& (+ %1 %2)) 1 2 3)
=> 3

一方、このソリューションには、の処理が含まれ%&、必要がないため、処理速度がわずかに低下する可能性があります(これについてはよくわかりませんが、他の誰かがフィードバックをくれる可能性があります)。かなり楽しい解決策は、ブロック%&内に固執することです。これはに評価されます。(comment ...)nil

=> (#(do (comment %&) (+ %1 %2)) 1 2 3)
=> 3

さらにエキゾチックな解決策は、を使用すること#_...です。これは(comment...)、読者が実際に何も入力していないかのように評価から削除することを除けば、非常によく似ています。(+ ...)このように、コードを短縮するために、本体の内側に貼り付けることができます。

=> (#(+ %1 %2 #_%&) 1 2 3)
=> 3

あなたは何を知っていますか、それはうまくいきました。私は実際にこれまでこれを試したことがありませんでした、そしてそれがうまくいくのを見て私はかなり驚いています。どうやら、#_...セクションが削除される前にいくつかの処理があります。変。

これらの奇妙なコメントソリューションのいずれかが気に入らず、それがうまくいかない場合は、いつでもブロックdo内に配置できます。(if nil ...)

=> (#(if nil %& (+ %1 %2)) 1 2 3)
=> 3

まあ、結局のところ、私はまだ最初の解決策(を使用(fn ...))が一番好きですが、これらの他のいくつかは確かに短いです。

于 2012-08-02T13:12:50.463 に答える
5

これは任意の数の引数に対して機能し、読み取り可能です。

(fn [& args] (apply + args))

最初の2つの引数のみを使用する場合(Alexのコメントによる):

(fn [& args] (apply + (take 2 args)))

直接使用できます。

((fn [& args] (apply + (take 2 args))) 1 2)
; => 3

または、関数を次のようなシンボルにバインドします。

(let [f (fn [& args] (apply + (take 2 args)))]
  (f 1 2))
; => 3

または、変数を作成します。

(def f (fn [& args] (apply + (take 2 args))))

または関数:

(defn f [& args] (apply + (take 2 args)))

最適な定義は、ユースケースによって異なります。

于 2012-08-02T12:22:27.337 に答える
4

これはどう?

(#(apply + (take 2 %&)) 1 2 3 4 5)
;; => 3
于 2012-08-02T13:58:20.397 に答える
1
user> (#(do %& (+ % %2)) 1 2)
3
user> (#(do %& (+ % %2)) 1 2 3)
3

あまりエレガントではありませんが、問題ないと思います。

于 2012-08-02T13:09:33.963 に答える