2 Stimmen

Eval-Formel in AS3?

Ich spiele ein bisschen mit ActionScript herum. Was ich möchte, ist, dass ich eine mathematische Funktion aus einer Zeichenfolge anzeigen kann.

In meinem Python-Skript, mit dem ich arbeite, mache ich z. B. so etwas:

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

Ich möchte dies nach ActionScript portieren, aber es scheint, als gäbe es seit Version 3 kein eval mehr. Wie kann ich meine Funktionswerte trotzdem berechnen?

3voto

Mikko Tapionlinna Punkte 1450

Etwas, das auch in Ihrem Fall funktionieren könnte, ist die Verwendung von Javascript eval stattdessen. Sie können etwas verwenden wie:

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

um mathematische Funktionen auszuwerten.

Dies ist eine recht einfache und nützliche Umgehung, da Javascript dem Actionscript recht ähnlich ist.

Wenn Sie den ExternalInterface-Aufruf innerhalb einer Schleife platzieren, kann er träge werden. Um dies zu vermeiden, können Sie die Schleife in Javascript schreiben. (Sie können sogar das gesamte Javascript in as3 schreiben, so dass Sie die eigentliche HTML-Seite nicht berühren müssen).

bearbeiten: Hier ist ein Link dazu.

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

2voto

dirkgently Punkte 104289

Sie müssen eine eval selbst. Sie müssen die Zeichenkette parsen und die richtigen Operatoren aufrufen.

Ici ist ein Link, der Ihnen den Einstieg erleichtert.

Das Tamarin-Projekt hat eine ECMAScript Parser in ES4 geschrieben. Versuchen Sie auch dies.

"Man kann sogar das gesamte Javascript in as3 schreiben, so dass man die eigentliche HTML-Seite nicht anfassen muss." Haben Sie Links/Tutorials? - okoman

Sowohl AS als auch JS basieren auf demselben ECMAScript-Standard. Wenn Sie also einen AS3-String an einen Container übergeben und die JS eval auf diese Zeichenkette anwenden, sollte es problemlos funktionieren.

2voto

Patrick Punkte 2623

Ich habe diese Frage gerade bemerkt und festgestellt, dass ich hier fast genau das Gleiche beantwortet habe: https://stackoverflow.com/a/11460839/1449525

Um es mit meinen Worten zu sagen: Sie können auf jeden Fall D.eval , AS3Eval oder ExternalInterface (wie in der aktuell gewählten Antwort), wenn Sie in einer Webseite ausgeführt werden. Es scheint jedoch, als bräuchten Sie nur etwas wie dieses einfache MathParser ( Mehr Informationen über den MathParser )

So verwenden Sie den 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]);
        }
    }
}

Ich bin mir sicher, dass ExternalInterface gut funktioniert, aber ich habe persönliche Vorbehalte gegen die sprachübergreifende Kommunikation (vor allem in Bezug auf Effizienz und Sicherheit) und auch gegen die unangenehme Natur der Sache. Ich habe das Gefühl, dass eine vollständig in sich geschlossene, gleichsprachige Lösung in den meisten Situationen vorzuziehen ist.

1voto

chuckdbacon Punkte 161

Etwas verspätet, aber als Hinweis: Die D.eval-Bibliothek tut das, wonach Sie fragen:

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

Es ist kostenlos und funktioniert gut für mich, aber es wird nicht mit Quellcode geliefert. Ich habe diese Frage gefunden, als ich nach einer alternativen integrierten oder quelloffenen Lösung suchte.

0voto

David Schoonover Punkte 2543

Es gibt auch ein scheinbar aufgegebenes Projekt zur Portierung von Tamarin auf Flash selbst:

http://eval.hurlant.com/

Es wäre toll, wenn es weitere Fortschritte gäbe, aber im Moment scheint es eine Kuriosität zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X