А что это вообще такое?

       

Системная переменная: caller


Все методы и операторы имеют локальную переменную caller, которая хранит «контекст вызова» метода или оператора.

Через нее можно:
·узнать, кто вызвал вызвавший описываемый метод или оператор, обратившись к $caller.self;  
·считать - $caller.считать, или записать - $caller.записать[значение] переменную, как будто вы находитесь в том месте, откуда вызвали описываемый метод или оператор.  

Например вам нужен оператор, похожий на системный for, но чем-то отличающийся от него. Вы можете написать его сами, воспользовавшись возможностью менять локальную переменную с именем, переданным вам, в контексте вызова вашего оператора.
@steppedfor[name;from;to;step;code]
$caller.$name($from)
^
while($caller.$name<=$to){
   $code
   ^caller.$name.
inc($step)
}

Теперь такой вызов…


@somewhere[][i]
^steppedfor[i](1;10;2){$i }

…напечатает «1 3 5 7 9 », обратите внимание, что изменяется локальная переменная метода somewhere.

Примечание: возможность узнать контекст вызова удобна для задания контекста компиляции кода (см. «process. Компиляция и исполнение строки».









Содержание раздела