$caller.self вообще не при делах
Misha v.3 04.06.2015 15:15
ведь это ссылка на объект, из которого происходит вызов, а в рассматриваемом случае хочется доступа к локальным переменным вызывающего метода.
в общем указателя на текущий метод, который бы можно было куда-то передать, не существует. поэтому единственный вариант -- ручное копирование.
пример (предположим, что у нас есть только ^while, и мы хотим с его помощью написать mysteppedfor, а затем, используя последний, реализовать сверху ещё и myfor):
@main[][n]
^myfor[n](2;4){$n<br />}
done.
@myfor[name;from;to;code][i]
^mysteppedfor[i]($from;$to;1){$caller.[$name]($i)$code}
@mysteppedfor[name;from;to;step;code]
$caller.[$name]($from)
^while($caller.[$name] <= $to){$code^caller.[$name].inc($step)}
внутри mysteppedfor будет происходить запись значения итератора в локальную переменную вызывающего метода, имя которого передано этому методу. т.е. в myfor мы заводим свою локальную переменную, в которую будет писать вызываемый mysteppedfor и потом ручками в теле вызова переписываем значение из этой локальной в вызывающий метод.
так, по моему, стоит делать в единственном случае: у нас есть метод, который пишет в $caller.$name, который мы используем сейчас, который мы хотим продолжать использовать из нашего метода и который мы не хотим менять (например метод чужого класса).
если мы пишем своё, то проще передать вглубь какой-нить объект (хэш), в котором и будет происходить накопление результата, а не заниматься записью результата вверх по цепочке caller-ов.
- Передача caller («Caller и рекурсия 2»), G_Z [M] 03.06.2015 15:50
- Ответ, moko [M] 03.06.2015 16:58
- Что-то не получается, G_Z [M] 03.06.2015 23:02
- Ответ, moko [M] 04.06.2015 20:31
- Ответ, G_Z [M] 04.06.2015 20:47
- Ответ, moko [M] 04.06.2015 22:03
- Ответ, G_Z [M] 04.06.2015 22:08
- Ответ, moko [M] 04.06.2015 22:17
- Ответ, G_Z [M] 04.06.2015 22:21
- Ответ, MoKo 06.06.2015 00:48
- Ответ, G_Z [M] 06.06.2015 01:06
- Ответ, MoKo 06.06.2015 01:33
- $caller.self вообще не при делах, Misha v.3 [M] 04.06.2015 15:15
- Ответ, G_Z [M] 04.06.2015 16:14 / 04.06.2015 18:51
- Ответ, Misha v.3 [M] 04.06.2015 23:19
- Ответ, G_Z [M] 04.06.2015 23:29