2011-01-27 15 views
12

Does Clojure specifica l'ordine di valutazione degli argomenti di funzione?Ordine di valutazione degli argomenti di funzione in Clojure

I.e. Quando chiamo una funzione in Clojure:

(my-func (fun1 arg1) (fun2 arg2) (fun3 arg3)) 

è l'ordine di valutazione di fun1, fun2, e fun3 definiti?

Capisco che Java definisca l'ordine di valutazione degli argomenti di funzione come da sinistra a destra, ma posso immaginare un linguaggio funzionale come Clojure che è più rilassato.

risposta

13

L'ordine di valutazione è da sinistra a destra. Vedere http://clojure.org/evaluation

Sia l'operatore e gli operandi (se presenti) vengono valutati, da sinistra a destra .

+4

E 'interessante da questo link per vedere che '((fun1 arg) (fun2 arg) (fun3 arg))' causerà tutte le funzioni 'funN' di essere chiamato, prima del risultato di' (fun1 arg) 'essere castato su un tipo di funzione (che potrebbe non essere). – pauldoo

10

Da sinistra a destra, ma anche all'interno (fun1 (fun2 arg2)).

Penso che in generale per un linguaggio funzionale, si vorrebbe evitare la situazione in cui (fun1 arg1) influenze (fun2 arg2) o (fun3 arg3). (fun1 arg1) restituirebbe idealmente un valore senza alterare lo stato delle strutture dati esistenti nel programma.

Pertanto, a seconda di quanto ci si avvicini a uno stile di programmazione funzionale, l'ordine di valutazione da sinistra a destra non è importante.

vedere http://clojure.org/state

+2

+1 per capire che se il tuo programma è scritto in perfetto stile FP, non dovrebbe importare .... – mikera

1

(my-func (fun1 arg1) (fun2 arg2) (fun3 arg3))

my-func ha sarà superato arity pari a 3. Il risultato di (arg1 fun1) come il primo argomento per my-func. Ecc. Quindi my-func verrà eseguito.

Pertanto l'ordine di valutazione degli argomenti su my-func non ha alcuna importanza.

Se si hanno degli effetti collaterali, quindi, bene, hmmmm ... Ma questa risposta non cambia. L'ordine non ha importanza.

Cheers -

Problemi correlati