2015-04-24 8 views

risposta

7

Il problema è che '(+ - * /) è un elenco di simboli, non un elenco di funzioni. I simboli implementano AFn e quando vengono forniti con due argomenti, la funzione tenta di cercare il simbolo nel primo argomento (2 qui) e restituisce il secondo argomento (5 qui) se la ricerca fallisce.

+1

Questa è una risposta più approfondita alla mia domanda, completata dalla soluzione fornita da @bsvingen. – user40129

4

C'è una funzione in clojure che fa esattamente quello che vuoi: juxt: http://clojuredocs.org/clojure.core/juxt

Così il vostro esempio può essere

(def funcs (juxt + - * /)) 
(funcs 2 5) 

Se qualcuno esce con una buona spiegazione per questo l'approccio map non lo fa lavoro mi piacerebbe sentire anche questo.

11

Questo funziona: (map #(% 2 5) [+ - * /])

Questo non lo fa: (map #(% 2 5) '[+ - * /])

Né questo: (map #(% 2 5) '(+ - * /))

La ragione è che quando si fa '(+ - * /), si ottiene una lista dei simboli +, - * e /, non le funzioni a cui si riferiscono - la citazione si applica anche ai valori della lista.

L'utilizzo di un vettore evita questo problema.

Se si desidera assolutamente un elenco, fare (map #(% 2 5) (list + - * /)).

Problemi correlati