Порядок оценки аргументов функции в Clojure - PullRequest
12 голосов
/ 27 января 2011

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

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

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

Порядок вычисления fun1, fun2, и fun3 определено?

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

Ответы [ 3 ]

13 голосов
/ 27 января 2011

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

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

10 голосов
/ 27 января 2011

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

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

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

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

1 голос
/ 28 августа 2013

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...