2010-07-22 7 views
7

wenn ich eine Liste von Funktionen haben:gelten zunächst aus einer Liste von Funktionen in Clojure

(def lst '(+ -))

und ich wünsche, die erste dieser Liste (+) auf eine Liste von Nummern anzuwenden, würde ich sein denkt

(apply (first lst) '(1 2 3 4))

aber anscheinend U falsch ist? Syntaxfehler nehme ich an. Wie mache ich das?

PS:

=>(first lst) 
+ 

=>(apply (first lst) '(1 2 3 4)) 
4 

beide Rückkehr ohne Fehler, sie einfach zurückgeben, was ich im ersten Fall erwarten würde, und was würde ich nicht in den zweiten erwarten.

Antwort

13

Da Ihre Liste wird zitiert:

(def lst '(+ -)) 
     ; ^- quote! 

ihre Mitglieder sind zwei Symbole, nicht funktioniert. Ein Symbol in Clojure als Funktion verwendet werden, aber dann wirkt es sehr ähnlich wie ein Schlüsselwort (dh sich in ihrer Argumentation auf aussieht):

('foo {'foo 1}) 
; => 1 

Die richtige Lösung ist, eine Liste zu verwenden - oder, idiomatisch, ein Vektor - Funktionen:

(def lst (list + -)) ; ok 
; or... 
(def lst `(~+ ~-)) ; very unusual in Clojure 
; or... 
(def lst [+ -])  ; the idiomatic solution 

Dann wird Ihr apply Beispiel arbeiten.

By the way, feststellen, dass eine Funktion, wenn sie von der REPL gedruckt zurück, sieht nicht aus wie das Symbol, das es nennt:

user=> + 
#<core$_PLUS_ [email protected]> 
+0

ahhhhhh. das macht jetzt so viel Sinn. Ich musste es einfach von jemandem hören, der wusste, was sie taten. Danke vielmals. – trh178

Verwandte Themen