Breno++
Just another Perl Hacker, Fernando (SmokeMachine) Em 31 de maio de 2012 16:26, Aureliano Guedes <guedes_1...@hotmail.com>escreveu: > Breno++, foi bem didatico e preciso na explicação. Apesar de ser algo > mais complexo para alguem como eu que não sou da area de computação, > consegui entender. Obrigado. > > > ------------------------------ > From: creakt...@gmail.com > Date: Thu, 31 May 2012 16:24:38 -0300 > To: rio-pm@pm.org > Subject: Re: [Rio-pm] variável $^H no Perl 5.16 > > > É exatamente isso que eu queria saber!!! Valeu! > > ++breno :D > > ABS() > > > > 2012/5/31 breno <br...@rio.pm.org> > > 2012/5/31 Aureliano Guedes <guedes_1...@hotmail.com>: > > Infelizmente isso foi como andar pra traz, na minha opinião. Eu não sabia > > disso, alias ainda estou preso no perl 5.14. > > > > Por quê? Como o Stan claramente apontou, é uma variável SOMENTE para > uso interno. No código demonstrado ele quebrou encapsulamento 2 vezes > (uma ao mexer no $^H e outra ao futucar no namespace dos outros no %^H > - e escrevendo, ainda?! Stan malvado! Stan malvado!). A verdade é que > ele sabia disso e por isso deixou claro que só queria entender o que > estava acontecendo, e não reclamando da mudança. Se você não modifica > o fonte do perl ou depura internas do feature.pm, não deveria estar > usando nada disso. Se, pelo contrário, você está usando a API pública > (que por sinal não só é mais clara como tem menos caracteres > envolvidos): > > use feature 'say'; > > ou > > use feature ':5.10'; > > ou ainda: > > use v5.14; > > tudo continua funcionando normalmente. > > > Caso haja algum motivo para essa mudança, quando alguem descobrir me > > explique. > > > > O Fernando tem razão e isso está relacionado com a nova feature (essa > sim pública) do 5.16, que ativa somente as features de uma determinada > versão. Mais especificamente, ao fato de que agora escrever "use > VERSAO" carrega as features daquela versão sem precisar carregar o > "feature.pm" (ou o strict.pm, no caso de >= 5.14) > > Aos mais curiosos que quiserem continuar lendo, cuidado: algumas > entranhas serão expostas :) > > Antes de começar vale lembrar que estamos falando de duas variáveis > diferentes, $^H (que contém dicas para o interpretador na forma de > flags) e %^H (para implementação de pragmas em escopo léxico, > armazenando valores de estado na optree). > > A mudança aconteceu no final do ano passado. A idéia, até onde > entendi, é que o compilador agora reserva 3 bits no $^H para definição > dos chamados "feature bundles". Ou seja, se eu tenho "use v5.16" ele > vai passar a dica que, dentro daquele escopo léxico, somente > determinadas features estarão ativas. Quais são ativadas e quais não > são é o que fica nas chaves (privadas) 'feature_X' dentro do %^H. > Agora, portanto, o $^H precisa indicar ao interpretador se ele deve > usar as features definidas no %^H ou não. Se você não define, ele > entende como se não estivesse ativando feature alguma, independente do > que está no %^H. O valor é 0x1c000000 pq "ativa" 3 bits sequenciais em > binário (11100000000000000000000000000), usados para definir a máscara > padrão. Note, por exemplo, que se você colocar em $^H um outro valor > que também ative a flag de features, elas funcionarão normalmente via > %^H: > > perl -e 'BEGIN { $^H |= 0x1e2aff0d; $^H{feature_say} = 1; }; say $^V' > v5.16.0 > > Mais especificamente, se você definir um bundle padrão diferente da > máscara, ele vai escolher o bundle conforme o valor posicional do > número deslocado 26 bits para a direita (o tamanho da máscara) em > @feature::hint_bundles, que hoje vale qw( default 5.10 5.11 5.15 ). Ou > seja, podemos fazer: > > perl -e 'BEGIN { $^H |= 0x08000000; $^H{feature_say} = 1; }; say $^V' > v5.16.0 > > Já que 0x08000000 (hexa) é 1000000000000000000000000000 (binário) e > isso >> 26 vale 10 (2, em decimal), indicando que vai usar as features > do $hint_bundles[2], ou seja, 5.11. Analogamente, não ter a flag > definida é o mesmo que definir $^H{feature_say} com a máscara > 'default' (000) ativa. > > Na prática, o feature.h (também gerado pelo regen/feature.pl) usa > essas flags para definir quais features estão ativas em um determinado > momento (macros FEATURE_BUNDLE_CUSTOM e CURRENT_FEATURE_BUNDLE). Se > você não usar um feature bundle, ele assume o default, que no momento > é ativar apenas a feature 'array_base' (independente do que esteja no > %^H). Outra interessante consequência dessas modificações é permitir > que uma nova versão do perl desative determinada feature. Por exemplo, > escrever "use v5.16" desativa a variável $[ (disponível em versões > anteriores). Caso realmente precise usá-la, basta fazer "use v5.16; > use feature qw(array_base);" > > Quem quiser ver as modificações, estão em torno do commit 23a52d6b1d1. > Os arquivos pertinentes - lib/feature.pm e feature.h - são gerados > pelo regen/feature.pl, chamado via regen.pl. > > Espero ter ajudado :) > > []s > > -b > _______________________________________________ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm > > > > _______________________________________________ Rio-pm mailing list > Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm > > _______________________________________________ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm >
_______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm