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

sexta-feira, 5 de dezembro de 2008

Persistência de dados entre execuções em OpenStep

GNUstep OpenStep facilita a persistência de dados entre uma execução e outra do programa através da classe NSUserDefaults.

Para persistir dados para a próxima execução, basta criar um dicionário (NSDictionary) representando um hash dos dados a serem persistidos.

Digamos que o dicionário seja defaults e APP_NAME é uma string (NSString) representando o nome da aplicação:
[[NSUserDefaults standardUserDefaults]
setPersistentDomain: defaults
forName: APP_NAME
];


E para recuperar os dados persistidos da última execução:
NSDictionary *defaults = [
[NSUserDefaults standardUserDefaults]
persistentDomainForName: APP_NAME
];


Então defaults será um dicionário contendo os dados persistidos!

Simples assim. =)

Referência: GNUstep Base.

[]'s
Cacilhas, La Batalema