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. :-)