Pregunta

Estoy jugando un poco con ActionScript. Lo que quiero es que puedo mostrar una función matemática de una cadena.

por ejemplo. en mi script en Python de trabajo que hago algo así:

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

Quiero puerto esta a ActionScript, pero parece que no hay más de evaluación puesto que la versión 3. ¿Cómo puedo calcular mis valores de la función de todos modos?

¿Fue útil?

Solución

Algo que también podría funcionar en su caso, está utilizando Javascript eval lugar. Se puede usar algo como:

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

para evaluar las funciones matemáticas.

Esta es una solución algo fácil y útil como javascript está bastante cerca de actionscript.

Si se pone la llamada ExternalInterface dentro de un bucle, puede ser lento. Para evitar esto, se puede escribir el bucle en javascript. (Puede incluso escribir todo el código JavaScript dentro de AS3, por lo que no es necesario tocar la página real html.)

editar: He aquí un enlace para ello.

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

Otros consejos

Usted tendrá que escribir un eval mismo. Usted tendrá que analizar la cadena e invocar los operadores adecuados.

Aquí 'sa enlace para empezar.

El proyecto Tamarin tiene una ECMAScript analizador escrito en ES4. Prueba esto también.

  

"Puede incluso escribir todo el código JavaScript dentro de AS3, por lo que no es necesario tocar la página real html." ¿Tiene enlaces / tutoriales? - okoman

Tanto AS y JS se basan en el mismo estándar ECMAScript. Por lo tanto, si se pasa una cadena de AS3 a un contenedor, y el uso de JS <=> en esta cadena, que debería funcionar bien.

Sólo notado esta pregunta y se dio cuenta respondí casi exactamente lo mismo aquí: https://stackoverflow.com/a/11460839/ 1449525

Para parafrasear a mí mismo, definitivamente se puede utilizar D.eval , AS3Eval o ExternalInterface (como se ve en la actualidad la respuesta elegida) suponiendo que se está ejecutando en una página web. Sin embargo, todo parece que realmente necesita es algo así como este sencillo MathParser ( Más información sobre el MathParser )

Así es como tendrá que utilizar el 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]);
        }
    }
}

Estoy seguro de que las cosas ExternalInterface funciona muy bien, pero tengo reservas personales acerca de la comunicación entre lenguajes (especialmente en términos de eficiencia y seguridad), así como sólo la naturaleza incómoda de la misma. Me siento como una solución contenida absoluta, del mismo lenguaje es generalmente preferible en la mayoría de las situaciones.

Un poco tarde, pero para referencia, la biblioteca D.eval hace lo que está pidiendo:

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

Es gratuito y funciona muy bien para mí, pero no viene con la fuente. He encontrado esta pregunta en busca de una alternativa incorporado o solución de código disponible.

También hay un proyecto aparentemente abandonada al puerto Tamarin a Flash en sí:

http://eval.hurlant.com/

Sería increíble si se avanzara más, pero que parece ser una curiosidad por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top