Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : yurik shestakov                      2:5020/400     09 Jun 2004  17:23:49
 To : Alexander Kostiuchenko
 Subject : Re: name from reference
 -------------------------------------------------------------------------------- 
 
 On Tue, Jun 08, 2004 at 02:53:47PM +0400, Alexander Kostiuchenko wrote:
 
  ys>> Чего-то я не уловил сути в данной реализации, особенно две вещи:
  ys>>    1) grep {/^$/} keys %$vars -- ты чего тут хочешь получить?
 AK> имена всех скалярных переменных (естессно, вместо $ там \$)
  ys>>    2) не понятно, что сделает ext("$_").
 AK> пример вызова функции, осуществляющей биндинг (у меня ext(&) по-другому
 AK> называется, имена случайно совпали, когда код в самом письме правил)
 
 Ага, все ясно.
 
  AK>>> Оказалось - PadWalker не умеет создавать переменные caller'a,
  AK>>> только модифицировать. Да и strict пришлось бы отключать...
  ys>> IMHO без грубого вмешательства во внутренности Perl такое
  ys>> не провернуть.
 AK> Вот как раз и было интересно, как вмешаться....
 
 Я из интереса сам попробовал разобраться с работой "атрибутов"....
 По ходу дела понял, что мне не обязательно знать имя переменной,
 мне передается в "Attribute::Handlers" ссылка на переменную.
 Далее с этой ссылкой я могу сделать хоть bless, хоть tie, хоть
 то и другое последовательно. 
 
  AK>>> Более-менее подходит вариант с local our $name. Хотя это не совсем
  AK>>> то - из-за "побочного эффекта" с dynamical scoping. Так что вопрос
  AK>>> все еще в силе.
  ys>> p.s. Что-то у меня такое чувство, что без tie тут не обойтись.
 AK> У tie недостаток есть - нельзя обьявить сразу несколько связанных
 AK> переменных (т.е. сделать аналог my ($a,$b,@c) : Tied).
 AK> И фиг бы с ним, если б хоть в этом
 AK> случае была возможность избежать передачи строки с именем переменной.
 AK> А с local our тоже проблема вылезла - в 5.6 для таких переменных аттрибуты
 AK> просто игнорируются (не вызывается обработчик; в 5.8 все работает).
 
 Можно, у меня получилось с использованием модуля Attribute::Handlers.
 К примеру, у меня есть модуль ix::dec, к-й есть wrapper вокрут
 либы informix для работы с decimal (двоично-десятичная арифметика).
 Обычно я им пользовался так:
 my $x = new ix::dec 10; # создавалась строка, в к-й хранился собственно
                         # dec_t, и на которую делался bless $dec, 'ix::dec';
 
 Вчера добавил две вещи:
   1. Функция TIESCALAR -- реально вызывает то же new().
   2. Добавил в dec.pm пару строк:
 
 use Attribute::Handlers autotie => { DEC => __PACKAGE__ }
 sub UNIVERSAL::DEC : ATTR(SCALAR) {
   my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
   my @data = ref $data eq 'ARRAY' ? @$data : $data;
   #  print "UNIVERSAL::DEC() tie($referent) to @data\n";
   tie $$referent, 'ix::dec', @data;
 }
 
 Использовать просто:
 
 my $x : DEC = 1.111; # сначала позовется TIESCALAR/new, потом STORE
 my ($x, $y, $z) : DEC(2.2); # TIESCALAR/new с аргументом 2.2 на всех
                             # переменных по очереди
 
 Отладочный вывод:
 
 UNIVERSAL::DEC() tie(SCALAR(0x8178af0)) to 2.2
 dec.pm: TIESCALAR(ix::dec 2.2)
 ix::dec::new() class=ix::dec
 ix::dec::new(2.2) has double arg
 UNIVERSAL::DEC() tie(SCALAR(0x8178b08)) to 2.2
 dec.pm: TIESCALAR(ix::dec 2.2)
 ix::dec::new() class=ix::dec
 ix::dec::new(2.2) has double arg
 UNIVERSAL::DEC() tie(SCALAR(0x8178b20)) to 2.2
 dec.pm: TIESCALAR(ix::dec 2.2)
 ix::dec::new() class=ix::dec
 ix::dec::new(2.2) has double arg
 
 -- 
 // yurik shestakov
 --- ifmail v.2.15dev5.3
  * Origin: Unknown (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 name from reference   Alexander Kostiuchenko   08 Jun 2004 01:04:07 
 Re: name from reference   yurik shestakov   08 Jun 2004 11:13:42 
 name from reference   Alexander Kostiuchenko   08 Jun 2004 09:50:05 
 Re: name from reference   yurik shestakov   08 Jun 2004 17:19:37 
 name from reference   Alexander Kostiuchenko   08 Jun 2004 15:53:47 
 Re: name from reference   yurik shestakov   09 Jun 2004 17:23:49 
 name from reference   Alexander Kostiuchenko   10 Jun 2004 00:42:16 
 Re: name from reference   yurik shestakov   10 Jun 2004 11:29:20 
 Re: name from reference   Andrew Alakozow   08 Jun 2004 13:37:34 
Архивное /ru.perl/100691e2fbaf9.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional