Eval формула в AS3? - PullRequest
       14

Eval формула в AS3?

2 голосов
/ 22 марта 2009

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

например. в моем рабочем скрипте Python я делаю что-то вроде этого:

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

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

Ответы [ 5 ]

3 голосов
/ 23 марта 2009

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

var result = ExternalInterface.call(myEvalFunctionInJS,formula)

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

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

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

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

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

2 голосов
/ 27 августа 2012

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

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

2 голосов
/ 22 марта 2009

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

Вот ссылка , с которой можно начать.

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

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

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

1 голос
/ 30 мая 2011

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

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

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

0 голосов
/ 23 апреля 2009

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

http://eval.hurlant.com/

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

...