Quarta-feira, 10 de Dezembro de 2008

Perl6

Perl Larry Wall, criador do Perl e cocriador do Parrot, declarou que a versão 6 de Perl não será compatível com as versões anteriores.

Realmente dei uma olhada no Perl6 e está muito diferente… só que para melhor. =)

A única coisa de que não gostei foram das mudanças em expressões regulares, no mais as mudanças só acrescentam.

Tipagem


Uma das maiores reclamações que os programadores fazem de Perl é sua tipagem insanamente fraca, apenas três tipos: escalar ($scalar), vetor (@array) e vetor associativo (%hash).

Perl6 traz o suporte a tipos! Pelo que vi na documentação, há seis tipos novos: inteiro (int), ponto flutuante (num), string (str), booleano (bool), bit (bit) e referência (ref), de forma estática:
my int $foo = 5;
my str $bar = "foo";
my num $baz = 5.3;
my bool $foobar = 1;


Conversão:
print str 5;
print scalar @list;


Passagem de parâmetros


Em Perl a passagem de parâmetros sempre foi por cópia, agora passa a ser por referência, exceto para tipos primitivos.

No caso de atribuição de referência de tipos primitivos, em vez do tradicional:
 my $b = \$a;


Passa a ser:
 my $b := $a;


Mudanças em vetores


A criação de vetor passa a suportar um formato mais simples.

Temos o tradicional:
my @fruits = ("apple", "pear", "banana");


Que passa a ser:
my @fruits = "apple", "pear", "banana";


E a lista:
my @fruits = qw/apple pear banana/;


Passa a ser:
my @fruits = <apple pear banana>;


Em Perl5, para se obter um item de um vetor, o primeiro carácter mudava de @ para $: $fruits[0]. Agora, em Perl6, não há mais alteração: @fruits[0].

A quantidade de elementos de um vetor era dada por:
my $count = $#fruits + 1;


Agora, em Perl6 passa a ser:
my int $count = @fruits.elems;


Repara que o famigerado -> virou um simples ponto!

Também para obter o último elemento do vetor, que era:
my $last = $fruit[$#fruit];


Passa a ser:
my $last = @fruit[@fruit.end];


Ou ainda:
my $last = @fruit[*-1];


Para se obter um vetor em um contexto string, Perl6 oferece o atalho ~. Para numérico + e para booleano ?:
my str $str_fruits = ~@fruits;
my num $num_fruits = +@fruits;
my bool $bool_fruits = ?@fruits;


Tratamento de exceções


Em Perl5 era usado eval para avaliar um bloco com possível exceção e $@ recebia os dados de exceção:
eval {

};
if ($@) {
warn "exception: $@";
}


Perl6 passa a usar try-CATCH:
try {

CATCH {
warn "exception: $!";
}
}


Repare que a mensagem de exceção passa a ser capturada em $! e o bloco CATCH fica dentro do bloco try.

Repetições


Não há uma forma menos dolorosa de dizer isso: foreach vira for, que também passa a suportar algumas construções de while, for vira loop, que também passa a suportar algumas construções de while.

Então:
foreach (@fruits) {


Vira:
for @fruits {


E:
foreach my $fruit (@fruits) {


Vira:
for @fruits -> $fruit {


Agora, olha o while aí:
while (my($age, $sex, $location) = splice @whatever, 0, 3) {


Vira:
for @whatever -> $age, $sex, $location {


Contando até dez em Perl5:
for (my $i = 1; $i <=10; $i++) {
print "$i\n";
}


Contando até dez em Perl6:
loop (my $i = 1; $i <=10; $i++) {
say $i;
}


E loop { … } funciona como while (1) { … }.

Vetor associativo


Sofre alterações parecidas com as de vetor.

Por exemplo, em Perl5:
my $c = $days{February};


Em Perl6 vira:
my int $c = %days{'February'};


Ou ainda:
my int $c = %days<February>;


Alguns métodos


Para se obter o tamanho de uma string em Perl5:
my $len = length $string;


Em Perl6 fica:
my int $len = $string.chars;


Para exibir um vetor de modo ordenado em Perl5:
print sort(@fruits);


Em Perl6:
say @array.sort;


Ou ainda:
@array.sort.print;


Variáveis de sistema


Para se obter o valor da variável HOME em Perl5:
print $ENV{HOME};


Em Perl6 passa a ser:
print %*ENV<HOME>;


Ou ainda:
print $+HOME;


Orientação a objetos


Criar uma classe em Perl5 era uma aventura!

Você criava um pacote (package) e «abençoava» um escalar com o pacote… pronto: aí tinha uma instância cuja classe era o pacote.

Um tremendo bacalhau.

Em Perl6 temos as palavras reservadas class, has (para atributos) e method (para métodos), para criar classes reais.

Métodos privados precisam começar com !, por exemplo, $!age, e métodos públicos precisam começar com ., como por exemplo $.name.

A passagem de parâmetros também mudou. Além de ser por referência, como citado, passa a suportar parâmetros nominais e parâmetros excedentes – como *args de Python, mas com a sintaxe *@args.

Se o argumento for mutável precisa ser seguido de is rw.

O que era:
package Square;
@ISA = qw/ Rectangle /;


Passa a ser:
class Square is Rectangle {


E o que era:
my $rect = new Rectangle(4, 5);


Passa a ser:
my Rectangle $rect .= new(4, 5);


Conclusão


Há muito mais! Consulte a página Perl6::Perl5::Differences, mas o que já sabemos é: quem trabalha com Perl vai precisar aprender de novo!

[]'s
Cacilhas, La Batalema

11 comentários:

Walter Cruz disse...

Bacana! Conheço pouco de Perl, mas pelo post vejo que vai ficar bem melhor, e bem consistente.

Só falta PHP melhorar agora ! -> é feio demais!

La Batalema Pitonisto disse...

É…

-> vem de C++ e, pelo que entendi, era pra ser →, mas como não é um carácter ASCII, foi usada uma representação ASCII – assim como o ^ de Smalltalk, que deveria ser ↑.

Mas realmente -> é feio demais!

[]'s
Cacilhas, La Batalema

Claudio disse...

Python 3 já saiu, senhores! Ela não parece tão diferente da linha 2. O que acham?

La Batalema Pitonisto disse...

Pelo que vi de Python 3000, está bem menos diferente de Python 2.x do que Perl6 de Perl5.

[]'s
Cacilhas, La Batalema

Tiago Peczenyj disse...

Meldels... ter classes em Perl é excelente mas instanciar um novo tipo ficou um tanto estranho... sem falar que $+HOME é de dar medo :)

Eduardo Willians disse...

Hheheh, esse Perl 6 está demorando tanto que GvR declarou que não desejava que a mudança de Python 3 fosse tão radical que chegasse a se tornar um Perl 6. Se o GvR tivesse atendido ao anseio da galera de retirar a obrigatoriedade da 'self' na definição de um método, talvez Python 3 tivesse de fato se tornado um Perl 6 heheeh.

Eduardo Willians disse...

Perl pra mim sempre foi aquela história de "não li mas não gostei".

Eduardo Willians disse...

Pra que esse negócio chato de moderação de comentário?

La Batalema Pitonisto disse...

Bem Eduardo,

Eu sei que moderação é uma apurrinhação pra quem escreve o comentário, mas acredite: uma apurrinhação maior ainda pra mim, que fico moderando essa jossa. =(

No começo eu deixava sem moderação mesmo, mas tem muita gente que escreve comentário apenas para desinformar e criar confusão, e aí a apurrinhação pra todo mundo é ainda maior do que a sua de esperar eu autorizar e a do que a minha de ficar moderando.

Por favor, não nos leve a mal. ;-)

[]'s
Cacilhas, La Batalema

Anônimo disse...

Só uma coisinha: foreach sempre foi sinônimo de for em Perl5

La Batalema Pitonisto disse...

Interessante…

Aprendi foreach e nunca pensei em usar for para a mesma finalidade.

E funciona!

Só mais uma coisa: quando for postar um comentário, por favor identifique-se.

[]'s
Cacilhas, La Batalema