Pergunta

Eu estou brincando um pouco com o ActionScript. O que eu quero é que eu posso exibir uma função matemática de uma string.

por exemplo. no meu script python trabalhando eu fazer algo assim:

formula = 'x**2 + 3*x'
for x in range( 0, 100 ):
    y = eval( formula )
    graph.display( x, y )

Eu quero esta porta para ActionScript, mas parece que não há mais eval desde a versão 3. Como posso calcular meus valores da função de qualquer maneira?

Foi útil?

Solução

Algo que pode também funcionar no seu caso, está usando Javascript eval vez. Você pode usar algo como:

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

para avaliar funções matemáticas.

Esta é uma solução um pouco mais fácil e útil como javascript é bastante próximo ao ActionScript.

Se você colocar a chamada ExternalInterface dentro de um loop, ele pode tornar-se lento. Para evitar isso, você pode escrever o loop em JavaScript. (Você pode até escrever todo o javascript dentro as3, de modo que você não precisa tocar a página html real.)

edit: Aqui está uma ligação para isso.

http://www.actionscript.org/resources/articles/745/2/JavaScript-and-VBScript-Injection-in-ActionScript-3/Page2.html

Outras dicas

Você terá que escrever um eval si mesmo. Você terá que analisar a cadeia e invocar os operadores de direito.

Aqui 'elo sa para você começar.

O projeto Tamarin tem um ECMAScript analisador escrito em ES4. Tente isso também.

"Você pode até escrever todo o javascript dentro as3, de modo que você não precisa tocar a página html real." Você tem links / tutoriais? - okoman

Ambos AS e JS são baseados no mesmo padrão ECMAScript. Então, se você passar uma cadeia de AS3 para um recipiente e use eval de JS sobre esta cadeia, ele deve funcionar muito bem.

Apenas notado esta pergunta e percebi que respondeu quase exatamente a mesma coisa aqui: https://stackoverflow.com/a/11460839/ 1449525

Para parafrasear-me, você pode definitivamente usar D.eval , AS3Eval , ou ExternalInterface (como visto na resposta atualmente escolhido) supondo que você estiver executando em uma página web. No entanto, tudo parece que você realmente precisa é de algo como este simples MathParser ( Mais informações sobre o MathParser )

Veja como você pode usar o MathParser:

package {
    import bkde.as3.parsers.*;
    import flash.display.Sprite;
    public class MathTest extends Sprite {
        public function MathTest() {
            var parser:MathParser = new MathParser([]);
            var compiledObj:CompiledObject = parser.doCompile("(10/3)*4+10");
            var answer:Number = parser.doEval(compiledObj.PolishArray, []);

            var xyParser:MathParser = new MathParser(["x", "y"]);
            var xyCompiledObj:CompiledObject = xyParser.doCompile("(x/3)*y+10");
            var xyAnswer:Number = xyParser.doEval(xyCompiledObj.PolishArray, [10, 4]);
        }
    }
}

Eu tenho certeza que coisas ExternalInterface funciona muito bem, mas tenho reservas pessoais sobre a comunicação entre linguagens (especialmente em termos de eficiência e segurança), bem como apenas a natureza estranha dele. Eu me sinto como uma solução integral-suficiente, mesmo a linguagem é geralmente preferível na maioria das situações.

Um pouco tarde, mas para referência, a biblioteca D.eval faz o que você está pedindo:

http://www.riaone.com/products/deval/

Ele é gratuito e funciona muito bem para mim, mas não vem com fonte. Eu encontrei esta pergunta à procura de uma alternativa interna ou solução de código-disponível.

Há também um projeto aparentemente abandonado à porta Tamarin à própria inflamação:

http://eval.hurlant.com/

Seria fantástico se mais progresso foi feito, mas parece ser uma curiosidade para agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top