[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