[Moscow.pm] Решил опубликовать модуль.

Mons Anderson inthrax на gmail.com
Пт Июл 17 02:00:51 PDT 2009


Замечения:
1. модуль "прагматичен", а прагмы пишутся в lc

2. хочу задать вопрос: 
почему-бы не сделать в своем проекте модуль My::Constants, в котором 
определить все константы через use constant, и экспортировать их как обычно.

3. my %flags в корне пакета - потенциальные проблемы. сделай our.

4. У sub FLAGS::SET дай прототип (@)

5. также посмотри на:
* http://search.cpan.org/dist/ctflags/
* http://search.cpan.org/dist/constant-def/

А вообще интересно, можно будет поюзать.

Думаю правда что прагму flags могут и не пропустить, она мождет быть 
зарезервирована. Я бы предложил заюзать второй уровень в constant::
если кто будет искать что-то, связанное с константами, он будет искать 
constant::*

как насчет constant::global? или constant::static?

или вообще constant::our ;)

О! Еще мысль

я подозреваю проблемы, связанные с тем, что DEBUG будет один на всех, что не 
очень хорошо.
предусмотри неймспейсы.
т.е. по дефолту юзается корневой неймспейс, но можно определить 
дополнительный.

типа так:
use FLAGS::SET DEBUG => 1; # default DEBUG
use FLAGS::SET::NS Namespace => { DEBUG => 0 }; # Namespace.DEBUG

usage:
use FLAGS 'DEBUG';
use FLAGS::NS Namespace => [qw(DEBUG)];


On Thursday 16 July 2009 20:23:54 Denis Evdokimov wrote:
> Предпосылки:
> Основной плюс констант в том, что они подставляется на этапе "компиляции".
> В добавок ко всему, все условия содержащие только константы выкидываются.
> Так
> if(1)
> {
>     print "text";
> }
> преобразуется в
> print "text";
>
> А
> if(0)
> {
>     print "text";
> }
> просто выбросится.
>
>
> В подтверждение этих слов:
>
> use Benchmark qw(:all);
>
> use constant DEBUG => 0;
> our $DEBUG_global = 0;
> my $DEBUG_local = 0;
> my $test = {
>     constant => sub {
>         for ( 0 .. 10000 )
>         {
>             if (DEBUG)
>             {
>                 warn "DEBUG";
>             }
>         }
>     },
>     global => sub {
>         for ( 0 .. 10000 )
>         {
>             if ($DEBUG_global)
>             {
>                 warn "DEBUG";
>             }
>         }
>     },
>     local => sub {
>         for ( 0 .. 10000 )
>         {
>             if ($DEBUG_local)
>             {
>                 warn "DEBUG";
>             }
>         }
>     },
> };
>
> timethese(-10, $test);
>
>
>
> Зная об этом поведении я пользовался следующим хаком
> В начале программы писал
> use constant DEBUG => 0;
> а в подключаемых модулях писал
> if(main::DEBUG)
> {
>
> }
> Но...
> 1. Это не красиво
> 2. Обязывает прописывать все константы
>
>
> Вот я и решил избавиться от этих проблем.
> Предположительное название модуля FLAGS.
> Исходники и пример использования в приложении.
> Всё очень сумбурно, так что жду вопросы и комментарии.



-- 
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956


Подробная информация о списке рассылки Moscow-pm