|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Modus ponens
|
Порядок вычисления аргументов функции
Недавно вышел у нас спор о легитимности присвоения нового значения аргументу функции, если этот аргумент передается в функцию более одного раза (чтобы было понятнее - пример):
now - какая-то дата. Смысл спора в том, на сколько вправе программист предполагать, что порядок вычисления параметров будет всегда слева нaправо, и что год будет посчитан для даты до того, как она будет изменена (и если это был последний месяц, то может получится, что год будет следующим годом, хотя это совсем не то, что требовалось). Я искал в справке информацию по этому поводу, но что-то ничего такого пока не нашел. Технически, я пока еще не видел, чтобы аргументы вычислялись в другом порядке, но если ружжо висит на стенке, то когда-нибудь обязательно выстрелит...
__________________
Hell is the possibility of sanity |
|
|||||
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; } 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; } Видимо ,сначала в функцию передаются аргументы, а потом начинается обработка этих аргументов
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
Тут дело немного в другом :
Сначала в функцию передадутся параметры a и то что возвращает b, но даже если b изменит a, а уже передалось в том виде в котором было, соответственно верно предположить что порядок передачи аргументов идет слева направо.
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
Вообще-то
Цитата:
Думаю программист вправе. Но я лучше заведу лишнюю переменную, пожертвовав "красотой" решения.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
Modus ponens
|
Я к тому, что предположим в Си порядок вычисления аргументов не определен, и каждый компилятор делает это в меру своей испорченности - по-разному, некоторые компиляторы могут даже в пределах одной функции делать это то справа налево, то слева направо. Таким образом, код типа f(i, ++i) в Си счиается непортабельным. В некоторых других языках порядок вычисления аргументов изначально оговорен, и (например в Common Lisp) код (f i (setf i (1+ i))) вполне себе портабельный (но, например, в Scheme тот же самый код - не портабельный, да и вообще не правильный, т.как порядок вычисления не определен).
Я искал похожую информацию про AS3 - в том смысле, что я думал, что, например, в статье про Function это должно было бы быть оговорено - ан нет...
__________________
Hell is the possibility of sanity |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Максимум, что я себе позволяю: items.splice(i--, 1);
Но это совершенно однозначный код. |
Часовой пояс GMT +4, время: 19:07. |
|
« Предыдущая тема | Следующая тема » |
|
|