2011-10-27 32 views
10

Clojureの奇妙さ。私はこの関数を定義して呼び出しようとしています。それは3つの引数を持っていますが、私は3つの引数でそれを呼び出すとき、私は、私は2つの引数でそれを呼び出すときClojure関数に渡された引数の数が間違っています

Wrong number of args (1) passed to: solr-query$correct-doc-in-results-QMARK-$fn 
[Thrown class clojure.lang.ArityException] 

を取得し、私は

Wrong number of args (2) passed to: solr-query$correct-doc-in-results-QMARK- 
    [Thrown class clojure.lang.ArityException] 

を取得し、私は4つの引数でそれを呼び出すとき、私は

を取得ここ
Wrong number of args (4) passed to: solr-query$correct-doc-in-results-QMARK- 
    [Thrown class clojure.lang.ArityException] 

は、関数の定義である:

(defn correct-doc-in-results? [query results docid] 
    "Check if the docid we expected is returned in the results" 
    (some #(.equals docid) (map :id (get results query)))) 

と、ここで私は(emacsの中スワンクを使用してREPLから)それを呼び出すようにしようとしている方法です:

(correct-doc-in-results? "FLASHLIGHT" all-queries "60184") 

誰もが何が起こっているか任意のアイデアがありますか?私は3を渡すときに1つの引数を渡すだけだと思う​​のですが、2または4のためにはそれを正しく取得するのはなぜですか?私は非常に流暢なクロージャーのプログラマーではありませんが、関数を定義することはかなり基本的です。最初はあなたの関数correct-doc-in-results?指す差

solr-query$correct-doc-in-results-QMARK-

solr-query$correct-doc-in-results-QMARK-$fn

答えて

15

注意。後者は、その関数内で定義されているいくつかの無名関数を指します。

2つまたは4つの引数を渡すと、予想通りにトップレベル関数のエラーが発生します。 3つの引数を渡すと、#(.equals docid)のエラーが発生します。これは、#(.equals docid)が引数を必要とせずに1つを取得しているためです。それを#(.equals % docid)に変更してみてください。

+0

もちろん。簡単な説明をありがとう。 –

+2

@Brian実際には、無名関数はゼロのargs(%はありません)を望んでおり、 'some'によって呼び出されたときに無名関数が取得されているためです。もちろん、関数が実際に引数なしで呼び出された場合、引数が1つしかない '.equals'を呼び出すことによって別のエラーが発生します。 – amalloy

+0

あなたが正しいです、私は私の答えを編集します。 –

関連する問題