parser

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

 

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

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

Александр Петросян (PAF) 18.12.2006 22:30 / 18.12.2006 22:33

кстати, в .NET запрещено иметь такие смущающие читателя переменные.
и правильно, что запрещено.
у нас, конечно же, если не делать узкого диапазона видимости локальной переменной, получится верхняя переменная локальна.
и это плохо.

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

думается, можно так:
при компиляции
$:variable1[значение]
делать так:
#это при компиляции
есть ли среди локальных переменных variable1?
#это при компиляции
есть: ошибка, 'делать одноимённые локальные запрещено'
#это при компиляции
нет, продолжаем:
#это такой байт-код пишем
добавить к локальным переменным ещё одну variable1
#это при компиляции
в компилятор добавить список переменных на удаление в конце текущего блока 'variable1'
#это такой байт-код пишем
-собственно присваивание-
#это такой байт-код пишем
-дальнейший поток инструкций до конца текущего блока-
#это при компиляции
если есть локальные переменные на удаление:
#это такой байт-код пишем
удалить variabl1 из списка локальных"
блок тут:
или до конца метода, или до конца [такого блока], или до конца {такого блока}.

похожие действия нужно скомпилировать и в итераторы, куда локальные переменные передаются:
^for[:i](0;9){...}
чтобы означало
есть ли среди локальных переменных variable1?
есть: ошибка, 'делать одноимённые локальные запрещено'
нет, продолжаем:
добавить к локальным переменным ещё одну variable1
{блок кода с собственно вызовом for}
удалить локальную переменную variabl1 из списка локальных
всё это сделать вполне можно.
изменение компилятора средней сложности.

небольшой побочный эффект:
если раньше локальные переменные гуртом уничтожались сборщиком мусора (для экономии времени).
то сейчас будет hash.delete происходить по выходу каждой $:объявленной переменной за область видимости.
поэтому имеет смысл сразу оптимизацию приделать:
если переменную объявили в самом начале метода (раньше только просто user string), то её только добавлять в список локальных и не добавлять в список на удаление (она сама умрёт вместе со всем methodFram'ом).

уф.