Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Порядок вычисления аргументов функции (http://www.flasher.ru/forum/showthread.php?t=170277)

wvxvw 21.10.2011 16:01

Порядок вычисления аргументов функции
 
Недавно вышел у нас спор о легитимности присвоения нового значения аргументу функции, если этот аргумент передается в функцию более одного раза (чтобы было понятнее - пример):
Код AS3:

new Date(now.fullYear, ++now.month, 0);

now - какая-то дата. Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо, и что год будет посчитан для даты до того, как она будет изменена (и если это был последний месяц, то может получится, что год будет следующим годом, хотя это совсем не то, что требовалось). Я искал в справке информацию по этому поводу, но что-то ничего такого пока не нашел. Технически, я пока еще не видел, чтобы аргументы вычислялись в другом порядке, но если ружжо висит на стенке, то когда-нибудь обязательно выстрелит...

Genzo 21.10.2011 16:45

Код AS3:

var o:Object = {b:1};
                o.a = function(){this.b++;return 2;};
                trace(calc(o.b,o.a()));
            }
 
            private function calc(x:int , y:int):int
            {
                trace(x,y);
                return x + y;
            }

Выведет : 1 ,2 ,3
Код AS3:

var o:Object = {b:1};
                o.a = function(){this.b++;return 2;};
                o.a();
                trace(calc(o.b,o.a()));
            }
 
            private function calc(x:int , y:int):int
            {
                trace(x,y);
                return x + y;
            }

Выведет : 2 ,2 ,4

Видимо ,сначала в функцию передаются аргументы, а потом начинается обработка этих аргументов

in4core 21.10.2011 16:49

Genzo - ww спрашивает на сколько понял о другом.

типа
Код AS3:

function(a, b):void {  first init a or b ? }


Genzo 21.10.2011 16:53

Тут дело немного в другом :
Код AS3:

function(a, b()):void {  first init a or b ? }

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

GBee 21.10.2011 17:24

Вообще-то
Цитата:

Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо
Здесь должна была быть шутка про письмо справа налево

Думаю программист вправе. Но я лучше заведу лишнюю переменную, пожертвовав "красотой" решения.

dimarik 21.10.2011 20:29

Спор о легитимности в программировании. Вкусно, как орбит-анонимная_функция.

wvxvw 21.10.2011 21:37

Я к тому, что предположим в Си порядок вычисления аргументов не определен, и каждый компилятор делает это в меру своей испорченности - по-разному, некоторые компиляторы могут даже в пределах одной функции делать это то справа налево, то слева направо. Таким образом, код типа f(i, ++i) в Си счиается непортабельным. В некоторых других языках порядок вычисления аргументов изначально оговорен, и (например в Common Lisp) код (f i (setf i (1+ i))) вполне себе портабельный (но, например, в Scheme тот же самый код - не портабельный, да и вообще не правильный, т.как порядок вычисления не определен).
Я искал похожую информацию про AS3 - в том смысле, что я думал, что, например, в статье про Function это должно было бы быть оговорено - ан нет...

dimarik 21.10.2011 22:21

Легитимность, выходит, на вкус компилятора.

etc 22.10.2011 00:05

Максимум, что я себе позволяю: items.splice(i--, 1);
Но это совершенно однозначный код.


Часовой пояс GMT +4, время: 11:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.