Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Динамическое создание Function... (http://www.flasher.ru/forum/showthread.php?t=67322)

Dracula_DIS 30.07.2005 22:24

Динамическое создание Function...
 
Возможно ли динамически создать function?

смысл. например есть Y=X*X, создаю класс в котором должна эта матиматическая функция обрабатываться, т.е. подставляем X выдает cоответствующий Y. в принципе сие есть
function fun(x:Number):Number{return x*x} но это надо задавать вне класса и такая форма не удобна. есть ли способ просто как-то передать Х*Х в обработчик класса который преобразует как-то переданное в полноценную функцию. может кто знает?

iNils 31.07.2005 00:05

а почему не удобна?

Dracula_DIS 31.07.2005 00:10

Цитата:

Сообщение от iNils
а почему не удобна?

ну допустим что формула задается из вне...

iNils 31.07.2005 00:14

ну тогда пусть в классе будет переменная которая содержит ссылку на функцию. тогда можно для каждого экземпляра класса задавать свою функцию.

Dracula_DIS 31.07.2005 00:30

ссылку на какую функцию?
надо сделать так чтобы обращение к классу было вроде этого:

myFunc = new Func(x*x)

потом переработать полученное и обрабатывать его как обычную функцию.
допустим никаких данных кроме строки х*х вне класса нет. как быть?

вообще как можно передавать ссылку на function в класс?

iNils 31.07.2005 00:42

Ты ведь знаешь что подгружать код в swf нельзя. Код должен быть заранее скопилирован. Если ты динамически задаешь формулу, то тебе придется писать парсер для обработки строки с формулой.

и ссылку на фунцкию ты передаешь не в класс, а в его экземпляр (пример: setInterval)

Dracula_DIS 31.07.2005 00:48

ок. допустим есть у нас парсер который определяет что "х*х" есть х*х как мне эту строчку передать в класс?

iNils 31.07.2005 00:53

да забудь ты про класс. есть только экземпляр класса
и строчка передается так

экземпляр = new класс ("формула")

Dracula_DIS 31.07.2005 01:04

как мне потом использывать твою "формула" ?

если у меня есть
function f(x:Number):Number{
return x*x }

то я, чтобы получить ответ обращаюсь так: y = f(5)
а если у меня просто y=x*x то как?

KidsKilla 31.07.2005 01:08

Цитата:

Сообщение от Dracula_DIS
как мне потом использывать твою "формула" ?

если у меня есть
function f(x:Number):Number{
return x*x }

то я, чтобы получить ответ обращаюсь так: y = f(5)
а если у меня просто y=x*x то как?

чуве, ты в курсе, что такое ПАРСЕР?

Dracula_DIS 31.07.2005 01:15

чуве, мне твой парсер н... не нужен.
ты суть вопроса то понял??

Function как класс имеет только:
Function.call()
Function.apply()

а мне мужно типа того что для класса MovieClip есть createEmptyMovieClip()

7thsky™ 31.07.2005 01:57

Цитата:

чуве, мне твой парсер н... не нужен.
ты суть вопроса то понял??
это твой единственный вариант, так как ты это хочешь, во флэше не реализовать!
флэш не поддерживает полностью операторы eval & function так как это описанно в ECMA

Dracula_DIS 31.07.2005 02:02

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

KidsKilla 31.07.2005 04:39

хамы, одни хамы кругом...

1) парсер это функция, принимающая параметром некую строку, после чего она её анализирует и в данном случае превращает её в математическое выражение.

2) глянь тут http://www.senocular.com/flash/source.php что-то было такое. вроде графика в зависимости от заданной ф-ции.

Dracula_DIS 02.08.2005 14:08

непонял!!!
 
Цитата:

Сообщение от KidsKilla
хамы, одни хамы кругом...

1) парсер это функция, принимающая параметром некую строку, после чего она её анализирует и в данном случае превращает её в математическое выражение.

2) глянь тут http://www.senocular.com/flash/source.php что-то было такое. вроде графика в зависимости от заданной ф-ции.

непонял, кто тут хам?? ты первый начал! я тебе не ЧУВЕ.. понял??

ты вообще читал мои посты?? ты предлагаешь для каждого вычисления гонять парсер так чтоли??

iNils 02.08.2005 14:25

Другого варианта нет. Либо ты заранее "зашиваешь" формулы во флеш. Либо ты пользуешься парсером для обработки динамических формул.

Хотя есть еще вариант. Пишешь формулы и php генерит тебе флешку с данной функцией и тыее подгружаешь свой основной флеш. Но это уже отдельная песня...

KidsKilla 02.08.2005 15:02

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

по поводу 1го поясню:
чуве, мне твой парсер н... не нужен.
ты суть вопроса то понял??

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

iNils 02.08.2005 15:13

Господа хватит отношения выяснять.
2KidsKilla: мне бы твое обращение тоже слух порезало, лучше как-то привычнее обращаться, гораздо больше шансов на правильное понимание
2Dracula_DIS: а тебе горячиться тоже сразу не стоило, может это опячатка была. сам иногда буквы в словах пропускаю.

MaxLife 02.08.2005 20:57

Можно сделать классическим способом - для выражения строить так называемое бинарное дерево, где каждой математической операции (+, -, /, *, etc) соответствует узел дерева, к которому привешиваются операнды, участвующие в этом выражении - количеством от нуля до бесконечности :) Операндом может быть как число, так и ссылка на другую операцию. В итоге, чтобы получить результат, надо пройти по дереву снизу вверх и прорешать все выражения. На самом же верхнем уровне будет вычислен результат. Таким образом, можно отпарсить выражение один раз, и вычислять его потом сколько угодно. Для облегчения решения рекомендую поискать метод "венгерской записи" - не путать с венгерской нотацией - где-нибудь в теории компиляторов.

KidsKilla 02.08.2005 21:03

Цитата:

Сообщение от MaxLife
Можно сделать классическим способом - для выражения строить так называемое бинарное дерево, где каждой математической операции (+, -, /, *, etc) соответствует узел дерева, к которому привешиваются операнды, участвующие в этом выражении - количеством от нуля до бесконечности :) Операндом может быть как число, так и ссылка на другую операцию. В итоге, чтобы получить результат, надо пройти по дереву снизу вверх и прорешать все выражения. На самом же верхнем уровне будет вычислен результат. Таким образом, можно отпарсить выражение один раз, и вычислять его потом сколько угодно. Для облегчения решения рекомендую поискать метод "венгерской записи" - не путать с венгерской нотацией - где-нибудь в теории компиляторов.

ты описываешь структуру парсера...

MaxLife 02.08.2005 21:08

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

KidsKilla 02.08.2005 21:10

в любом случае ф-цию придётся каждый раз вызывать.
а шум зашел из-за того что не работает eval("x*x");

MaxLife 02.08.2005 21:12

в честь чего каждый-то? при создании нового выражения - да. при вычислении одного и того же несколько раз - не обязательно.

opex 02.08.2005 22:12

Я думаю тебе нужно использовать Обратную польскую запись :)

MaxLife 03.08.2005 18:56

блин, действительно польскую :) склероз :(

St. Father 18.08.2005 13:41

Подниму трэд. Практически та же байда.
Цитата из хэлпа:
"...при ее помощи можно динамически преобразовывать строки в идентификаторы объектов, клипов и функций..." - эт про eval.
суть в следующем. надо запускать функцию с параметром(ами), причем имя и параметры должны браться из строки. т.е. что-то типа:
Код:

var str:String = "trase ('help')";
eval (str); //знаю, что бред ;)
function trase (txt)
{
        trace(txt);
}

Если все же я неправильно понял фразу "преобразовывать строки в идентификаторы функций", то помогите написать парсер для этого дела, плиз, я уже голову сломал на том, как это можно реализовать.
Спасибо!)

St. Father 18.08.2005 13:53

упс, так сказать...
нашел решение сам. :)
Код:

var f:String = "ff";
var str = eval ("tr")(f);
function tr (t)
{
        if (t)
                trace(t);
        else
                trace("no text");
}

мож пригодится кому ;)

Carl Johnson 14.04.2006 17:25

можно так

e = "x * x"
f = eval(" function(x) {return " + e + "};")
потом типа y = f(x)

куда надо просто передаешь "x * x"

но по-моему удобнее просто передать функцию


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

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