2011-10-27 17 views
10

Altre stranezze Clojure. Ho questa funzione che sto cercando di definire e chiamare. Dispone di 3 argomenti, ma quando io lo chiamo con 3 argomenti ottengoNumero errato di argomenti passati a una funzione Clojure

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

quando lo chiamo io con 2 argomenti ricevo

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

e quando io lo chiamo con 4 argomenti ottengo

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

qui è la definizione della funzione:

(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)))) 

e ecco come sto cercando di chiamare (dal REPL utilizzando Swank in emacs):

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

Qualcuno ha idea di cosa sta succedendo? Perché pensa che sto passando solo 1 argomento quando passo 3, ma lo faccio bene per 2 o 4? Non sono ancora un programmatore di clojure molto fluente, ma definire una funzione è piuttosto semplice.

risposta

15

nota la differenza tra

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

e

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

Il primo si riferisce alla funzione correct-doc-in-results?. Quest'ultimo si riferisce ad alcune funzioni anonime definite all'interno di quella funzione.

Se si passano 2 o 4 argomenti, si riceve un errore per la funzione di primo livello, come previsto. Quando si passano 3 argomenti, si riceve un errore per #(.equals docid), perché #(.equals docid) vuole zero argomenti ma ne sta ricevendo uno. Prova a cambiarlo in #(.equals % docid).

+0

Naturalmente. Grazie per la semplice spiegazione. –

+2

@Brian in realtà l'errore è perché la funzione anonima vuole zero args (non ha%) e ne riceve uno quando viene chiamata da 'some'. Naturalmente, se la funzione in realtà * fosse * chiamata senza argomenti, allora causerebbe un altro errore cercando di chiamare '.equals' con un solo argomento. – amalloy

+0

Hai ragione, modificherò la mia risposta. –

Problemi correlati