2011-10-27 9 views
10

Więcej dziwności Clojure. Mam tę funkcję, którą próbuję zdefiniować i zadzwonić. Posiada 3 argumenty, ale gdy zgłoszę go z 3 argumenty mamUzyskanie błędnej liczby argumentów przekazanych do funkcji Clojure

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

gdy zgłoszę go z 2 argumentami mam

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

i gdy zgłoszę go z 4 argumentów mogę

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

tutaj jest definicja funkcji:

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

i tutaj jest jak próbuję to nazwać (od REPL przy użyciu Swank w emacs):

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

ktoś ma jakiś pomysł co się dzieje? Dlaczego wydaje mi się, że przechodzę tylko 1 argument, gdy przechodzę 3, ale dostaje to prawo dla 2 lub 4? Nie jestem jeszcze bardzo biegły programista clojure, ale określenie funkcji jest dość podstawowe.

Odpowiedz

15

zauważyć różnicę pomiędzy

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

i

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

Pierwszy odnosi się do funkcji correct-doc-in-results?. Ta ostatnia odnosi się do jakiejś anonimowej funkcji zdefiniowanej w tej funkcji.

Jeśli przekażesz 2 lub 4 argumenty, otrzymasz komunikat o błędzie dla funkcji toplevel, zgodnie z oczekiwaniami. Kiedy przekazujesz 3 argumenty, dostajesz błąd dla #(.equals docid), ponieważ #(.equals docid) chce zerowych argumentów, ale otrzymuje jeden. Spróbuj zmienić go na #(.equals % docid).

+0

Oczywiście. Dzięki za proste wyjaśnienie. –

+2

@Brian faktycznie jest to błąd, ponieważ anonimowa funkcja chce zerowych argumentów (nie ma%) i otrzymuje jeden, gdy zostanie wywołana przez 'some'. Oczywiście, jeśli funkcja faktycznie * została * wywołana bez żadnych argumentów, spowodowałaby kolejny błąd, próbując wywołać '.equals' z tylko jednym argumentem. – amalloy

+0

Masz rację, będę edytować moją odpowiedź. –

Powiązane problemy