parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

$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-ов.