2011-01-27 11 views
12

¿Clojure especifica el orden de evaluación de los argumentos de función?Orden de evaluación de los argumentos de función en Clojure

I.e. Cuando llamo a una función en Clojure:

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

es el orden de evaluación de fun1, fun2 y fun3 definidos?

Entiendo que Java define el orden de evaluación de los argumentos de la función como de izquierda a derecha, pero puedo imaginar un lenguaje funcional como Clojure que es más relajado.

Respuesta

13

El orden de evaluación es de izquierda a derecha. Ver http://clojure.org/evaluation

Tanto el operador y los operandos (si los hay) son evaluados, de izquierda a derecha .

+4

Es interesante desde ese enlace para ver que '((fun1 arg) (fun2 arg) (fun3 arg))' hará que todas las funciones funN' 'a ser llamados, antes del resultado de' (fun1 arg) 'se convierte a un tipo de función (que podría no ser). – pauldoo

10

De izquierda a derecha, pero del revés también (fun1 (fun2 arg2)).

Creo que, en general, para un lenguaje funcional, querrá evitar la situación en la que (fun1 arg1) influye (fun2 arg2) o (fun3 arg3). (fun1 arg1) idealmente devolvería un valor sin alterar el estado de las estructuras de datos existentes en su programa.

Por lo tanto, dependiendo de cuán cerca se mantenga un estilo de programación funcional, el orden de evaluación de izquierda a derecha no es importante.

ver http://clojure.org/state

+2

+1 por la idea de que si su programa está escrito en un buen estilo FP, no debería importar ... – mikera

1

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

mi-func ha pasado aridad será de 3. El resultado de (arg1 fun1) como el primer argumento para my-func. Etc. Luego my-func se ejecutará.

Por lo tanto, el orden de evaluación de los argumentos de my-func no importa en absoluto.

Si tiene efectos secundarios, entonces, bueno, mmm ... Pero esta respuesta no cambia. El orden no importa.

Saludos -

Cuestiones relacionadas