Подтвердить что ты не робот

Порядок оценки аргументов функции в Clojure

Указывает ли Clojure порядок оценки аргументов функции?

т.е. Когда я вызываю функцию в Clojure:

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

Определен ли порядок оценки fun1, fun2 и fun3?

Я понимаю, что Java определяет порядок оценки аргументов функции слева направо, но я могу представить, что функциональный язык, такой как Clojure, более расслаблен.

4b9b3361

Ответ 1

Порядок оценки слева направо. См. http://clojure.org/evaluation

И оператор, и операнды (если таковые имеются), от слева до вправо.

Ответ 2

Слева направо, но наизнанку (fun1 (fun2 arg2)).

Я думаю, что в целом для функционального языка вы бы хотели избежать ситуации, когда влияют (fun1 arg1) (fun2 arg2) или (fun3 arg3). (fun1 arg1) идеально вернет значение без изменения состояния существующих структур данных в вашей программе.

Следовательно, в зависимости от того, насколько близко вы придерживаетесь стиля функционального программирования, порядок оценки слева направо не имеет значения.

см. http://clojure.org/state

Ответ 3

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

my-func имеет arity of 3. Результат (fun1 arg1) будет передан как первый аргумент my-func. И т.д. Затем будет выполняться my-func.

Поэтому порядок оценки аргументов my-func вообще не имеет значения.

Если у вас есть побочные эффекты, тогда, ну, хмммм... Но этот ответ не меняется. Порядок не имеет значения.

Приветствия -