PDA

Просмотр полной версии : Динамическое создание Function...


Dracula_DIS
30.07.2005, 22:24
Возможно ли динамически создать 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
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
как мне потом использывать твою "формула" ?

если у меня есть
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
хамы, одни хамы кругом...

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
Можно сделать классическим способом - для выражения строить так называемое бинарное дерево, где каждой математической операции (+, -, /, *, 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
Я думаю тебе нужно использовать Обратную польскую запись (http://trubetskoy1.narod.ru/ppn.html) :)

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"

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