[Moscow.pm] Хочется очень странного... local at upper level

Vladimir V. Perepelitsa inthrax на gmail.com
Вт Май 6 04:17:22 PDT 2008


On Monday 05 May 2008 22:08:00 Ivan B. Serezhkin wrote:
> Vladimir V. Perepelitsa wrote:
> > On Monday 05 May 2008 19:44:16 Ruslan Zakirov wrote:
> >> тоже очень хочу!
> >
> > собственно после ковыряния в большом кол-ве модулей, работающих со стеком
> > вызова прихожу к выводу, что нужно либо выковыривать куски кода,
> > отвечающие за %^H в 5.10 и пытаться имплементировать его в виде
> > подключаемого модуля, либо писать модуль с чем-то вроде parent_local($N,
> > $var) = ...;
> >
> > а насчет такого local это думаю вопрос к Сережкину.
> > он нам даже рассказывал как работает стек вызова ))
>
> А ? что ? где ?
> Я в туда не смотрел, так что раскажите плз, что делает localize_var() ?
>
> lexically scoped pragmas :
>
> package strict_refs;
> sub new {use strict 'refs'; return bless{};};
> sub DESTROY { no strict 'refs'};
>
> =)
>
> *{lalala}=sub{ ... };
> {
> my $strict=new strict_refs;
> # пишем аккуратно
>
> }
> # опять пишем всякую фигню типа ${'О боже, я беременна, сказала
> королева, и непонятно от кого'}=1;

это не будет работать :)
по крайней мере там где у тебя написано "пишем аккуратно" все равно будет 
режим no strict;

т.е. действие прагм ограничивается содержащим их блоком, т.е. сабами 
new/DESTROY.

мысль про new/DESTROY - понятна. собственно для этого мне и нужен был 
parent_local. new - инициализация состояния, DESTROY - очистка.
Так, кстати, сделано в модуле Hook::LexWrap

но я не хочу делать
{
	my $var = localize_var();
}
я хочу сделать 
{
	localize_var();
}
при этом эта саба должна сделать прибилизительно следующее:
sub localize_var {
	parent_local(1, ${+caller}.'::var') = bless ...
}
т.е. по сути мне нужно убрать нафиг временную переменную и в ее роли сделать 
локализованную глобальную, но при этом чтоб это было скрыто от потребителя 
этой функции.

для этого мне нужна функция parent_local :)

-- 
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956


Подробная информация о списке рассылки Moscow-pm