[Moscow.pm] Хочется очень странного... local at upper level
Ivan B. Serezhkin
ivan на serezhkin.com
Вт Май 6 04:58:45 PDT 2008
Vladimir V. Perepelitsa wrote:
> 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;
>
Да в курсе я, но это можно
Фишка в том, что ^H надо выставлять до компиляции в BEGIN {}
Во время исполнения оно уже роли не играет.
Так что если весь код обернуть в евал - то прокатит.
> т.е. действие прагм ограничивается содержащим их блоком, т.е. сабами
> 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 :)
>
>
Через ${+caller}.'::var' ты сделаешь не my, а our.
Ок. Подумаю на досуге.
--
Ivan B. Serezhkin
Подробная информация о списке рассылки Moscow-pm