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
1 | trace({freakFunction:function():String{return "Thats Freak"}}.freakFunction()); |
Resultado
Imprime: Thats 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 Thats 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!
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.
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"); } |
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 propexiste neste objeto.
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.
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]) );
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
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!
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
Trackbacks
Deixe Seu Comentário