parser

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

 

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

$:variable1[] << аналог my(variabl1) из Perl?

Александр Петросян (PAF) 17.12.2006 15:15

вариант сужение областей видимости локальных переменных.

возможно, часть читателей недоумевают, о каких "более локальных" мы тут толкуем.
казалось бы, уже есть глобальные
$MAIN:global1
, статические
$CLASS:static1
, локальные
@method[][local1]
переменные, чего-ж ещё?

а того, что часто переменная нужна ну совсем ненадолго.
скажем,
^if(условие){
   только если надо, мы делаем какое-то дело.
   скажем, что-то там загружаем и выводим
   иногда это дело большое, 
   и мы благоразумно выделяем это большое дело в метод
   ^actions[]
}
но гораздо чаще бывает, что дело это небольшое, на метод не тянущее:
^if(условие){
  $local1[загружаем]
  обрабатываем
  выводим
  $local1
}
#вот тут нам эта $local1 не нужна совсем
вот это и хочется подчеркнуть.

это можно сделать по-разному:
как "local(variable1);" в Perl — когда значение переменной сохраняется и восстанавливается в конце действия local.
или как Perl "my", оно же "обычные локальные" в C++, java, .net — когда значение переменной никуда не сохраняется, а просто "локально в области видимости, а вовсе не во всём методе".
в .net пошли дальше предшественников, явно запретив такое:
int a;
{
   int a;
}
в .net это не warning, а error.

мне кажется, Parser тут ближе по духу к Perl.
однако разводить Perl'овый local очень не хочется.
там этот local действовал через границу вызовов методов.
т.е.
local($magic)=123;
sub test{ print $magic; }
test();
печатал 123 за здорово живёшь.

это мне в Perl никогда не нравилось.
в Parser мы подвели под это базу: у нас это законное "поле объекта", а вовсе не чудище "хитрпролезшая подсохранившаяся глобальная переменная".

увы, опять же в силу особенностей реализации, мне пока малопонятно, как сделать "my". куда яснее, как сделать "local", или подделать "@method[][local1]".

ещё подумаем.