[SP-pm] Dúvida entre Scalar Context e List Context

Eden Cardim edencardim at gmail.com
Wed Mar 24 06:14:39 PDT 2010


2010/3/23 Thiago Glauco <thiago em nerdsland.net>:
> Aiai..
>
> Este é o tipo da coisa que é tão simples que fica difícil explicar...
>
> Quando o Perl foi criado, uma das preocupações do Larry era tornar a
> linguagem parecida com a linguagem humana. Que é influenciada pelo contexto.
> O contexto é algo que deve estar subentendido pelas duas partes do dialogo.
>
>
> Exemplo de contexto: “Chovem canivetes.” ou “Ele me cortou com um canivete.”
>
> A palavra canivete varia conforme o contexto. E você sabe disso
> intuitivamente, culturalmente. É impossível chover canivetes. Mas você sabe
> que canivetes são perigosos. Então se alguém disser que choveram canivetes,
> você associa o canivete a uma situação de chuva perigosa, logo muita chuva.

Na verdade, o contexto do perl não ocorre em termos de cultura, isso
seria impossível de automatizar. O contexto do perl ocorre em termos
de gramática, sintaxe e semântica:

"Diminua o grave da guitarra" vs "Ele sofreu um ferimento grave"

"Diminua" é um verbo transitivo, o que exige que ele seja
complementado por um objeto direto, nesse caso "grave", que indica que
a palavra "grave" nesse caso é um substantivo, no caso uma das
métricas de frequência sonora.

"um ferimento" é um objeto indireto, que pode ser opcionalmente
acompanhado de um complemento nominal, o que obriga "grave" a ser um
adjetivo, nesse caso, de intensidade.

Essa análise pode estar incorreta (não sou muito bom em lingua
portuguesa, alguém que for pode me corrigir), mas o importante aqui é
observar como o significante (o lexema "grave") permaneceu o mesmo,
mas o significado mudou para satisfazer a gramática e suas regras de
semântica.

> Agora, vamos levar isto para o Perl.
>
> $myVar = 1;
> $myOtherVar = 2;
> $sum = $myVar + $myOtherVar;

'+' é um operador binário de associação à esquerda. Operadores
binários exigem que os seus dois operandos sejam do mesmo tipo (ou
objetos sobrecarregados, que vou deixar de fora para simplificar). Por
ser associativo à esquerda, o operador '+' permite que o operando da
esquerda tem precedência na determinação do tipo. Pro caso específico
do operador '+', os operandos devem ser números. Se o operando já não
for um número (sim, o perl registra isso por trás das cenas), o perl
vai criar uma *representação numérica* do seu valor para ser usado no
lugar do operando. Observe que isso não é uma conversão, porque o
valor original não é modificado. A construção do número varia a
depender do operando: arrays são representados pela contagem dos
elementos; strings que comecem com uma representação numérica aceita
pelo perl são representados pelo número respectivo, as que não casam
são representados por 0; referências são representadas pelo endereço
de memória, etc.
O mesmo vale pro operador '=', que também é um operador binário de
associação à esquerda. O operador da esquerda sendo escalar, o
operador da direita também deve ser um escalar, e o perl cria as
representações adequadas para satisfazer a gramática.

> E o compilador sabe, pelo contexto, que agora você quer tratar $sum como uma
> string de texto, e não mais como um número...

Na verdade, quem faz essa análise é o interpretador, o compilador
apenas sabe, através da gramática, que um escalar qualquer pode estar
aparecer em qualquer lugar onde um número poderia aparecer, e o
interpretador vai saber se virar na hora de executar.

> O compilador sabe que não pode colocar o array dentro de um Scalar. Mas o
> compilador também sabe que você não é um idiota. Então ele pensa: "O que
> existe em um array que pode ser guardado dentro de um escalar? Ah, já sei. O
> número de elementos do array".

Não, ele não pensa, ele usa uma "pesca". Inclusive, você pode
sobrecarregar esse comportamento alterando a tabelinha que o perl usa
como "pesca". ;)

meus 0.02

-- 
   Eden Cardim       Need help with your Catalyst or DBIx::Class project?
  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://edenc.vox.com/            http://www.shadowcat.co.uk/servers/


More information about the SaoPaulo-pm mailing list