Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   String>Function (http://www.flasher.ru/forum/showthread.php?t=144959)

TanaTiX 26.09.2010 04:05

String>Function
 
Возможно ли заставить приложение интерпретировать некоторую строку как функцию? Если да, то как?

Котяра 26.09.2010 04:14

Цитата:

this[functionName](functionArgs..);
только костыльно всё это, и try-catch надо ставить
Или имеется ввиду eval?
есть решения. я пробовал собственный эвалюатор делать, некоторые, даже транслятор as3 на as3 делали
ссылки сходу не найду.

TanaTiX 26.09.2010 13:23

Не совсем то. Кстати, что за eval?
Я имею в виду что-то типа (псевдокод)
Код AS3:

var str:String="trace('bla-bla-bla')";
var f:Function =new Function();
f=str as Function;
this[f]();


samana 26.09.2010 13:27

Конечно можно.
Код AS3:

var out:Function=trace
out("wellcome")//wellcome


TanaTiX 26.09.2010 14:52

samana, а в каком месте в данном случае строка определяется как функция?
Может это возможно реализовать, поковырявшись в байткоде? Вот сейчас смотрю варианты и не понимаю структуру swf: такое впечатление, что в swf сначала перечисляются функции, затем их содержимое и еще где-то что-то. Проверял на трэйсах...

samana 26.09.2010 14:54

А, я понял, что не правильно понял вопрос. Старею....)

Psycho Tiger 26.09.2010 15:29

Речь таки о функциях или о методах?
Если о функциях - парсится строка и getDefinitionByName.

TanaTiX 26.09.2010 15:52

Речь о функциях. Т.е. есть некоторый текст, который является string. И есть желание выполнить этот текст так, как будто он написан не переменной, а кодом. Понимаю, что в таком виде это скорее всего бред, поэтому и полез ковырять байткод, но пока что-то не особо выходит. Может это вообще не возможно и я просто зря трачу время?

Psycho Tiger 26.09.2010 16:10

Пример вызова функции trace
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.utils.getDefinitionByName;
 
        public class SomeBaseClass extends Sprite
        {
 
                public function SomeBaseClass()
                {
                        super();
                        var str:String = "trace(\"Hello world!\")";
 
                        eval(str);
                }
 
                private function eval(str:String):void
                {
                        var brace1Index:int = str.indexOf("(");
                        var brace2Index:int = str.indexOf(")");
 
                        //+2 и -1 чтобы убрать кавычки
                        var innerString:String = str.substring(brace1Index + 2, brace2Index -1);
                        var command:Function = getDefinitionByName(str.substr(0, brace1Index)) as Function;
                        command.call(this, innerString);
                }
 
        }
 
}

Писать парсер внутренних скобок, много аргументов разных типов и т.д. лень.

TanaTiX 26.09.2010 16:23

Psycho Tiger, спасибо. Нужно будет помучать этот вариант.


Часовой пояс GMT +4, время: 23:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.