[Viana-pm] uso de prototypes nas funções/subrotinas em Perl

Eduardo Marques sacorb at sapo.pt
Thu Dec 21 02:25:32 PST 2006


João Ferreira wrote:
> Olá a todos,
>
> tenho andado a discutir com alguns colegas o seguinte: o que é que se
> ganha/perde em usar prototypes nas funções de Perl ??
>
> qq coisa do tipo:
>
> sub soma($$) {
>    my ($a,$b)=@_;
>    return $a+$b;
> }
>
> ...
>
> my $resultado=soma(2,3);
>
> 1 - um possivel interesse seria verificar a quantidade de argumentos
> em pré-runtime ???
>
> 2 - por outro lado tornaria o código mais legível (ou talvez não)....
>
> 3 - no entanto não vejo a declaração dos arguimentos em lado nenhum...
> pelos vistos ninguém usa aquilo.. ?!?!
>
> alguém tem um ponto de vista sobre isto???
>
> Cumprimentos a todos
> Obrigado
>   
O Damian Conway tem. :)

Do livro "Perl Best Practices":

 > Prototypes:

 > _Don't use subroutine prototypes_

O protótipo faz com que não seja possível deduzir o comportamento da 
função olhando para a chamada, nem o contexto em que os argumentos vão 
ser avaliados. Porque o que o protótipo faz é dizer ao perl qual o 
contexto em que o argumento vai ser avaliado. Se o protótipo for func 
($), isso não significa que o primeiro argumento é um escalar, significa 
que se se passar uma lista como primeiro argumento, ela é avaliada em 
contexto escalar.

No caso sub soma ($$) {} até nem é muito mau, se alguem tiver um 
@numeros = (4, 3); e chamar soma(@numeros), sem o protótipo a coisa 
funciona, mas com o protótipo, o perl avalia @numeros em contextos 
escalar para o primeiro argumento, ($a = 2), não tem um segundo 
argumento e estoura. Mas e se soma tem um terceiro argumento, @, com um  
grupo de parametros qualquer que influencia o resultado (por exemplo, a 
base com que o resultado é devolvido). Ao chamar soma(@numeros, 
'octal'), o perl decide que $a = 2, $b = 0, @args =(), e devolve $a + 
$b. 2. O que não era exactamente o comportamento esperado, nem pela 
pessoa que usa a função, nem (provavelmente) pelo programador.

Outro problema da prototipagem é ser inútil quando se passa para 
programação OO. A chamada de métodos ignora o protótipo.


More information about the Viana-pm mailing list