2017-01-28 6 views
0

of this questionで説明されているように、Clojureは無体関数(#()で定義)のパラメータ数を本体で参照される最大パラメータインデックス最大参照パラメータは%4であり、その無名関数は4つのパラメータを有する)。Clojureの無名関数のためのダミー(未使用)パラメータの宣言

質問:Clojureコンパイラに、匿名関数がそのパラメータを参照しなくても1つのパラメータを必要とすることを伝える構文がありますか?または、この場合、唯一の「クリーンな方法」*はfn syntaxを使用することですか? (*「クリーンな方法」:ほとんどの場合、関数に影響を与えずにダミーパラメータを参照できることを認識しています - 下記を参照してください)。

私の使用例:I (defn foo [predicate])があります。predicateには1つの引数が必要ですが、fooには常にtrueを返す述語でテストしたいと考えています。 (つまり、#(true)のようなものです。)これは、#(true)がゼロ引数を期待していると解釈するので、ArityExceptionとなります。この特定のケースで

、私は#(or true %)のようないくつかの巧妙なハックを使用することができますが、:

  1. それはほとんどfn -variantとして入力するだけです。
  2. 一般的な解決策がある場合は興味があります。

編集:

#[1](true) ;; the anonymous function takes one parameter

+0

ではなく、一般的な質問 - のClojure 1.9を使用すると、[ 'どのよう探している述語が含まれますか? '](https://clojure.github.io/clojure/branch-master/clojure.core-api.html#clojure.core/any?)。 – glts

答えて

3

番号だけfnを使用しますので、明確にするために、私はこのような何かを探しています。それがそれのためのものです。

+0

確認してくれてありがとう、それは私があまりにも疑っていたものでした... – Attilio

2

それはあなたがconstantlyを使用することができた後、あなたは一定のリターンだ場合:これは上行うことができます実際には

(fn [& _] 
some-side-effect-expression) 
; ==> non functional value 

(map (constantly 10) '(1 2 3 4 5)) 
; ==> (10 10 10 10 10) 

それはない場合は、残りの引数でfnを使用することができますすべてのパス引数を必要としない高次関数:

(some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5)) 
; ==> (3 5 7 9) 
0

あなたは#(...)構文を主張した場合、あなたはあなたが返すようにしたいものは何でも、何も実行時のペナルティを負うない...

#(do % true) 

を書くことができます。

しかし(constantly true)@Sylvesterが示唆するように、慣用的で、かつ任意の引数リストを受け付けます。

特定について
((constantly true) 1 2 "Buckle my shoe");true 
関連する問題