2011-10-27 12 views
10

Más rareza de Clojure. Tengo esta función que estoy tratando de definir y llamar. Tiene 3 argumentos, pero cuando lo llamo con 3 argumentos consigoObteniendo el número equivocado de args pasados ​​a una función de Clojure

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

cuando llamo con 2 argumentos consigo

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

y cuando lo llamo con 4 argumentos consigo

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

aquí es la definición de la función:

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

y así es como estoy tratando de llamarlo (a partir del uso de Swank REPL en emacs):

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

Alguien tiene alguna idea de lo que está pasando? ¿Por qué cree que solo estoy pasando 1 argumento cuando estoy pasando 3, pero lo hago bien para 2 o 4? Todavía no soy un programador de clojure muy fluido, pero definir una función es bastante básico.

Respuesta

15

Nota la diferencia entre

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

y

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

La primera se refiere a la función correct-doc-in-results?. Este último se refiere a alguna función anónima definida dentro de esa función.

Si pasa 2 o 4 argumentos, obtendrá un error para su función toplevel, como se esperaba. Cuando pasa 3 argumentos, obtiene un error para #(.equals docid), porque #(.equals docid) quiere argumentos cero pero está obteniendo uno. Intente cambiarlo a #(.equals % docid).

+0

Por supuesto. Gracias por la simple explicación. –

+2

@Brian en realidad el error se debe a que la función anónima quiere cero argumentos (no tiene%) y está recibiendo uno cuando es llamado por 'some'. Por supuesto, si la función en realidad * fuera * llamada sin argumentos, entonces causaría otro error al tratar de llamar a '.equals' con un solo argumento. – amalloy

+0

Tienes razón, voy a editar mi respuesta. –

Cuestiones relacionadas