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
-
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
-
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
-
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:
-
if (1> 10)
-
{
-
if (20> 1)
-
trace("Teste 1");
-
}
-
else
-
{
-
trace("Teste 2");
-
}
Freak “In”
-
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
-
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
-
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:
-
for (expr1; expr2; expr3)
-
{
-
statements;
-
}
Eis que em linguagem de máquina o for será traduzido para:
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.
12 comentários para “FreaktionScript”
Eu li pq eu acho vc FreaktionProgrammer
() ()
|
=0=
Meu Deus !!!
Pô Beck….
Alguns desses problemas se resolvem com identação! AHEHAEHAEHAEHHAEHAEHAEHAHE
Muito interessante….
[]´s
Pô Diogo,
Se podemos complicar, pra quê facilitar?
[]’s
Beck Novaes
Perdi o sono… ;|
Também… em pleno domingo às 23 horas e você lendo estas coisas “Freak”. Só podia dar nisso!
[]’s
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
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!
[...] Agora a pergunta que não quer calar: seria este mais uma pattern do Freaktionscript? [...]
e esse sabe explicar o porque? ele vai entrar em loop infinito:
for(var a:uint = 10; a >= 0; a–){
trace(a);
}
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
[...] FreaktionScript Por que ele é relevante: Além de curioso fornece dicas que podem ajudar compreender melhor o [...]
Adicionar comentário
Eu li pq eu acho vc FreaktionProgrammer
() ()
|
=0=
Meu Deus !!!
Pô Beck….
Alguns desses problemas se resolvem com identação! AHEHAEHAEHAEHHAEHAEHAEHAHE
Muito interessante….
[]´s
Pô Diogo,
Se podemos complicar, pra quê facilitar?
[]’s
Beck Novaes
Perdi o sono… ;|
Também… em pleno domingo às 23 horas e você lendo estas coisas “Freak”. Só podia dar nisso!
[]’s
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
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!
[...] Agora a pergunta que não quer calar: seria este mais uma pattern do Freaktionscript? [...]
e esse sabe explicar o porque? ele vai entrar em loop infinito:
for(var a:uint = 10; a >= 0; a–){
trace(a);
}
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
[...] FreaktionScript Por que ele é relevante: Além de curioso fornece dicas que podem ajudar compreender melhor o [...]

