AS3中的Eval公式?

时间:2009-03-22 16:50:06

标签: actionscript-3 actionscript eval

我正在玩ActionScript。我想要的是我可以从字符串中显示数学函数。

E.g。在我的工作python脚本中,我做了类似的事情:

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

我想将它移植到ActionScript,但似乎从版本3开始没有更多的eval。我怎样才能计算我的函数值?

5 个答案:

答案 0 :(得分:3)

在你的情况下也可能有用的东西,而是使用Javascript eval。你可以使用类似的东西:

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

评估数学函数。

这是一个有点简单有用的解决方法,因为javascript非常接近于actionscript。

如果将ExternalInterface调用放在循环中,它可能会变得迟缓。为避免这种情况,您可以在javascript中编写循环。 (您甚至可以在as3中编写整个javascript,这样您就不需要触摸实际的html页面了。)

编辑: 这是一个链接。

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

答案 1 :(得分:2)

你必须自己写一个eval。您必须解析字符串并调用正确的运算符。

Here是一个帮助您入门的链接。

Tamarin项目有一个用ES4编写的ECMAScript parser。试试这个。

  

“您甚至可以在as3中编写整个javascript,这样您就不需要触摸实际的html页面了。”你有链接/教程吗? - okoman

AS和JS都基于相同的ECMAScript标准。因此,如果您将一个AS3字符串传递给容器,并在此字符串上使用JS的eval,它应该可以正常工作。

答案 2 :(得分:2)

刚刚注意到这个问题并意识到我几乎完全回答了这个问题:https://stackoverflow.com/a/11460839/1449525

为了解释自己,假设您正在网页中运行,您肯定可以使用D.evalAS3Eval或ExternalInterface(如当前所选答案中所示)。但是,看起来你真正需要的就是这样简单的MathParserMore info about the MathParser

以下是您使用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]);
        }
    }
}

我确信ExternalInterface的功能很好,但我对跨语言交流(特别是在效率和安全性方面)以及它的尴尬本质有个人保留意见。在大多数情况下,我觉得通常更喜欢完全包含的,同一语言的解决方案。

答案 3 :(得分:1)

有点晚了,但作为参考,D.eval库可以满足您的要求:

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

它是免费的,对我来说很棒,但不附带来源。我发现这个问题正在寻找替代的内置或源可用解决方案。

答案 4 :(得分:0)

还有一个似乎被遗弃的项目将Tamarin移植到Flash本身:

http://eval.hurlant.com/

如果取得更多进展会很棒,但现在似乎是一种好奇心。