2009-03-22 4 views
2

Я немного играю с ActionScript. Я хочу, чтобы я мог отображать математическую функцию из строки.Формула Eval в AS3?

E.g. в моем питона сценарий рабочего я сделать что-то вроде этого:

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

Я хочу порт этого на ActionScript, но кажется, что нет более Eval начиная с версии 3. Как я могу вычислить свои значения функции в любом случае?

ответ

3

Что-то, что может также работать в вашем случае, вместо этого использует Javascript eval. Вы можете использовать что-то вроде:

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

для оценки математических функций.

Это несколько простой и полезный обходной путь, поскольку javascript довольно близок к actionscript.

Если вы поместили вызов ExternalInterface внутри цикла, он может стать вялым. Чтобы этого избежать, вы можете написать цикл в javascript. (Вы можете даже написать весь javascript внутри as3, так что вам не нужно касаться фактической страницы html.)

Редактировать: Вот ссылка на это.

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

+0

«Вы даже можете написать весь javascript внутри as3, так что вам не нужно касаться фактической страницы html». У вас есть ссылки/учебники? – okoman

+0

Несомненно, вот что: http://www.actionscript.org/resources/articles/745/2/JavaScript-and-VBScript-Injection-in-ActionScript-3/Page2.html –

+0

О, хорошо, это довольно просто. Спасибо! – okoman

2

Вам нужно будет написать eval. Вам придется разбирать строку и вызывать правильные операторы.

Here - ссылка, с которой вы начнете.

Проект Tamarin имеет ECMAScript parser, написанный на ES4. Попробуйте это.

«Вы даже можете написать весь javascript внутри as3, так что вам не нужно касаться фактической страницы html». У вас есть ссылки/учебники? - okoman

И AS, и JS основаны на том же стандарте ECMAScript. Итак, если вы передаете строку AS3 в контейнер и используете JS's eval в этой строке, она должна работать нормально.

+0

Это именно то, чего я хочу избежать. ;) Тем не менее, похоже, что другого решения нет. – okoman

+0

Собираешься генерировать некоторую легкоразмерную формулу на других языках и отправлять ее на флеш ... – okoman

+0

Это еще одна мысль. Я не предлагал этого, так как ExternalInterface может быстро стать болью. – dirkgently

0

Существует также, казалось бы, заброшенный проект порта Тамарин, чтобы блеснуть себя:

http://eval.hurlant.com/

Было бы удивительным, если был сделан более значительный прогресс, но, кажется, как курьез на данный момент.

1

Немного поздно, но для справки, библиотека D.eval делает то, что вы просите:

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

Это бесплатно и работает для меня, но не приходит с источником. Я нашел этот вопрос в поиске альтернативного встроенного или доступного для источника решения.

2

Просто заметил этот вопрос и понял, что я ответил почти точно то же самое здесь: https://stackoverflow.com/a/11460839/1449525

Перефразируя себя, вы определенно можете использовать D.eval, AS3Eval или ExternalInterface (как показано в выбранном в данный момент ответа) предполагается, что вы» re работает на веб-странице. Тем не менее, все это кажется, что вам действительно нужно что-то вроде этого простого MathParser (More 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 материал работает просто отлично, но я имеют личные оговорки в отношении перекрестного языкового общения (особенно с точки зрения эффективности и безопасности), а также просто неудобного характера. Я чувствую, что в большинстве случаев типичное решение на одном языке, как правило, предпочтительнее.

 Смежные вопросы

  • Нет связанных вопросов^_^