FreaktionScript

Se você pensa que sabe tudo sobre ActionScript, prepare-se para ser confundido. FreaktionScript mostrará para você um conjunto de inutilidades inúteis bem fúteis. Coisa de Geek que não tem o que fazer a noite :-)


Freak Method Call


1
trace({freakFunction:function():String{return "That’s Freak"}}.freakFunction());

Resultado
Imprime: That’s Freak

Explicação
O Freak Method Call trata da criação de um objeto anônimo com uma função denominada “freakFunction” que retorna a String “That’s Freak”. No código, logo depois que o objeto com a sua função é criado (depois da ultima chave) a função é chamada tendo seu resultado processado pelo “trace”. Aliás, o que é pior, o código ou esta tentativa de explicá-lo? Dêem-me mais uma chance!





Freak Comparison


1
trace((3 > (2 < 1)).toString());

Resultado
Imprime: true

Explicação
“2 < 1” obviamente é “false”. Mas o que é “3 > false”? É bem esquisito comparar um número com um booleano, porém, o que torna isto possível é o fato dos literais “true” e “false” em ActionScript serem constantes para os números 1 e 0 respectivamente. Por isto, “3 > false” retorna “true”. Você já sabia disto? Você sabia também que “10 + true” é igual a 11? Acho que a explicação já melhorou um pouco.





Freak Condition


1
2
3
4
5
if (1 > 10)
   if (20 > 1)
      trace("Teste 1");
else
   trace("Teste 2");

Resultado
Nada acontece

Explicação
Neste caso o que engana é a identação. De fato, o “else” é do segundo e não do primeiro “if”. Isto acontece porque a notação de bloco ( chaves {} ) não é utilizada para especificar que apenas o segundo “if” (e não o “else”) deveria ser executado se fosse o caso da condição do primeiro “if” ser verdadeira. Complicado? O que eu quero dizer é que o problema seria resolvido se a mesma declaração fosse escrita da seguinte forma:

1
2
3
4
5
6
7
8
9
if (1 > 10)
{
   if (20 > 1)
      trace("Teste 1");
}
else
{
   trace("Teste 2");
}






Freak “In”


1
trace(("prop" in {prop:"test"}).toString());

Resultado
Imprime: true

Explicação
O “in” além de ter um significado especial quando utilizado em um “for” é também um operador relacional. Ele pode ser usado para verificar se determinada propriedade existe em um objeto. Neste caso um objeto anônimo esta sendo criado com a propriedade “prop” e o operador relacional “in” está sendo usado para verificar se a propriedade “prop’existe neste objeto.





Freak Method Call II – Refreaktored


1
2
3
4
private static var myFunction:Function = function():void
{
   trace("test");
}.apply(myFunction);

Resultado
Imprime: “test”

Explicação
Em ActionScript 3 tudo é objeto. Como objeto a função tem um método “apply” que fornece um modo de chamar a própria função (embora você possa mudar o escopo da execução). A declaração acima cria um objeto função e usa o seu método “apply” para executá-la imediatamente.





Freak For


1
for (var i:int=10, a:Array=[]; i--; a[i]=i, trace(a[i]) );

Resultado
Imprime em cada linha: 9 8 7 6 5 4 3 2 1 0

Explicação
Permitam-me ser um pouco mais prolixo (existe algo mais prolixo do que a própria palavra prolixo?). Para explicar o que acontece no “Freak For” recorrerei a semântica operacional:

Podemos representar o for da seguinte forma:

1
2
3
4
for (expr1; expr2; expr3)
{
   statements;
}

Eis que em linguagem de máquina o for será traduzido para:

1
2
3
4
5
6
7
8
expr 1;
LOOP:
if expr2 = 0 goto EXIT;
statements
expr 3
goto LOOP
EXIT:
…

As expressões (expr1, expr2, expr3) podem ser qualquer conjunto de declarações válidas separadas por vírgula. Assim, podemos ver pela semântica operacional que o que estiver na “expr1” será executado uma única vez. Em nosso exemplo duas variáveis são inicializadas:
for (var i:int=10, a:Array=[]; i–; a[i]=i, trace(a[i]) );

Já a segunda expressão trata do teste lógico que controla o final da execução dos statements e da “expr3”. No nosso exemplo é o “i–” que causará o final da execução do “for” quando ele for igual a 0 (lembre que o 0 é false vide Freak Condition).

for (var i:int=10, a:Array=[]; i–; a[i]=i, trace(a[i]) ); // termina quando i for 0

Por fim, podemos observar na semântica operacional que tanto os statements quando a “expr3” serão executados tantas vezes quanto a “expr2” permitir. No nosso exemplo não temos statements (que seria o corpo do for) mas a “expr3” é composta por uma atribuição e uma chamada à função trace.

for (var i:int=10, a:Array=[]; i–; a[i]=i, trace(a[i]) );





Posfácio



FreaktionScript pode não parecer útil a primeira vista, mas pode abrir a nossa cabeça para as construções da linguagem. Isto nos permite compreender melhor o próprio funcionamento do compilador e, em alguns casos, encontrar soluções interessantes para problemas inusitados.

Se você teve paciência para ler até aqui eu adoraria saber se você leu porque você é estranho ou se você é estranho porque você leu. :-)


13 comentários

  1. Daniel Passos em 2.fev.07 às 10:26 am

    Eu li pq eu acho vc FreaktionProgrammer

  2. Lucas Marçal em 2.fev.07 às 1:13 pm

    () ()
    |
    =0=

    Meu Deus !!!

  3. Diogo Moura em 2.fev.07 às 2:34 pm

    Pô Beck….
    Alguns desses problemas se resolvem com identação! AHEHAEHAEHAEHHAEHAEHAEHAHE
    Muito interessante….

    []´s

  4. Beck Novaes em 2.fev.07 às 3:21 pm

    Pô Diogo,

    Se podemos complicar, pra quê facilitar? ;-)

    []‘s
    Beck Novaes

  5. Bruno Neves em 4.fev.07 às 11:26 pm

    Perdi o sono… ;|

  6. Beck Novaes em 5.fev.07 às 9:58 am

    Também… em pleno domingo às 23 horas e você lendo estas coisas “Freak”. Só podia dar nisso! ;-)

    []‘s

  7. Rafael Maia em 8.fev.07 às 11:53 pm

    Oi Beck! aqui, me tira uma duvida, na hora da identação corretiva vc colocou

    “Actionscript:
    if (1> 10)
    {
    if (20> 1)
    trace(“Teste 1″);
    }
    else
    {
    trace(“Teste 2″);
    }

    mas desta forma o else pertence ao primeiro if, e não ao segundo certo? acho que o que vc quis dizer foi
    “Actionscript:
    if (1> 10)
    {
    if (20> 1)
    {
    trace(“Teste 1″);
    }
    else
    {
    trace(“Teste 2″);
    }
    }

    qualquer coisa me xinga! abraços

  8. Beck em 9.fev.07 às 12:43 am

    Olá Rafael,

    Eu só quis dizer que no primeiro exemplo há uma ambigüidade, pois parece que o “else” é do segundo “if”. Desta forma nada seria impresso ao contrário do que a ambigüidade sugere. Para resolver o problema, ou seja, para que algo seja impresso, é necessário o uso das chaves – e a identação por questões de legibilidade. Mas eu entendi perfeitamente o que você quis dizer e se eu tivesse feito como você sugere talvez o exemplo tivesse ficado melhor. Obrigado pelo seu feedback!

  9. Ederson em 29.fev.08 às 12:32 pm

    e esse sabe explicar o porque? ele vai entrar em loop infinito:

    for(var a:uint = 10; a >= 0; a–){
    trace(a);
    }

  10. Beck Novaes em 1.mar.08 às 9:52 pm

    Oras, parece simples. A ultima instrução do “for” não decrementa a vairável “a”. Logo, ela sempre será maior que zero.

    []‘s
    Beck Novaes

Trackbacks

  1. DClick Blog
  2. DClick Blog
  3. Tamanho de Container com Base nos Filhos | DClick Team Weblog [pt]

Deixe Seu Comentário