Просмотр полной версии : Динамическое создание Function...
Dracula_DIS
30.07.2005, 22:24
Возможно ли динамически создать function?
смысл. например есть Y=X*X, создаю класс в котором должна эта матиматическая функция обрабатываться, т.е. подставляем X выдает cоответствующий Y. в принципе сие есть
function fun(x:Number):Number{return x*x} но это надо задавать вне класса и такая форма не удобна. есть ли способ просто как-то передать Х*Х в обработчик класса который преобразует как-то переданное в полноценную функцию. может кто знает?
Dracula_DIS
31.07.2005, 00:10
а почему не удобна?
ну допустим что формула задается из вне...
ну тогда пусть в классе будет переменная которая содержит ссылку на функцию. тогда можно для каждого экземпляра класса задавать свою функцию.
Dracula_DIS
31.07.2005, 00:30
ссылку на какую функцию?
надо сделать так чтобы обращение к классу было вроде этого:
myFunc = new Func(x*x)
потом переработать полученное и обрабатывать его как обычную функцию.
допустим никаких данных кроме строки х*х вне класса нет. как быть?
вообще как можно передавать ссылку на function в класс?
Ты ведь знаешь что подгружать код в swf нельзя. Код должен быть заранее скопилирован. Если ты динамически задаешь формулу, то тебе придется писать парсер для обработки строки с формулой.
и ссылку на фунцкию ты передаешь не в класс, а в его экземпляр (пример: setInterval)
Dracula_DIS
31.07.2005, 00:48
ок. допустим есть у нас парсер который определяет что "х*х" есть х*х как мне эту строчку передать в класс?
да забудь ты про класс. есть только экземпляр класса
и строчка передается так
экземпляр = 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()
чуве, мне твой парсер н... не нужен.
ты суть вопроса то понял??
это твой единственный вариант, так как ты это хочешь, во флэше не реализовать!
флэш не поддерживает полностью операторы 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 что-то было такое. вроде графика в зависимости от заданной ф-ции.
непонял, кто тут хам?? ты первый начал! я тебе не ЧУВЕ.. понял??
ты вообще читал мои посты?? ты предлагаешь для каждого вычисления гонять парсер так чтоли??
Другого варианта нет. Либо ты заранее "зашиваешь" формулы во флеш. Либо ты пользуешься парсером для обработки динамических формул.
Хотя есть еще вариант. Пишешь формулы и php генерит тебе флешку с данной функцией и тыее подгружаешь свой основной флеш. Но это уже отдельная песня...
KidsKilla
02.08.2005, 15:02
да, предлагаю гонять.
из того что ты писал не совсем понятно, что же тебе нужно.
по поводу 1го поясню:
чуве, мне твой парсер н... не нужен.
ты суть вопроса то понял??
это хамство. значит ты хам. только все вопросы личного характера в личку.
чуве эт просто чувак. тебе это режет слух, мне другое.
Господа хватит отношения выяснять.
2KidsKilla: мне бы твое обращение тоже слух порезало, лучше как-то привычнее обращаться, гораздо больше шансов на правильное понимание
2Dracula_DIS: а тебе горячиться тоже сразу не стоило, может это опячатка была. сам иногда буквы в словах пропускаю.
Можно сделать классическим способом - для выражения строить так называемое бинарное дерево, где каждой математической операции (+, -, /, *, etc) соответствует узел дерева, к которому привешиваются операнды, участвующие в этом выражении - количеством от нуля до бесконечности :) Операндом может быть как число, так и ссылка на другую операцию. В итоге, чтобы получить результат, надо пройти по дереву снизу вверх и прорешать все выражения. На самом же верхнем уровне будет вычислен результат. Таким образом, можно отпарсить выражение один раз, и вычислять его потом сколько угодно. Для облегчения решения рекомендую поискать метод "венгерской записи" - не путать с венгерской нотацией - где-нибудь в теории компиляторов.
KidsKilla
02.08.2005, 21:03
Можно сделать классическим способом - для выражения строить так называемое бинарное дерево, где каждой математической операции (+, -, /, *, etc) соответствует узел дерева, к которому привешиваются операнды, участвующие в этом выражении - количеством от нуля до бесконечности :) Операндом может быть как число, так и ссылка на другую операцию. В итоге, чтобы получить результат, надо пройти по дереву снизу вверх и прорешать все выражения. На самом же верхнем уровне будет вычислен результат. Таким образом, можно отпарсить выражение один раз, и вычислять его потом сколько угодно. Для облегчения решения рекомендую поискать метод "венгерской записи" - не путать с венгерской нотацией - где-нибудь в теории компиляторов.
ты описываешь структуру парсера...
один из вариантов, конечно. но он не требует постоянного парсинга для каждого вычисления. дерево потом можно крутить сколько угодно, и менять значения переменных. шум, как я понял, дошёл до того, что на каждое вычисление нужен парсинг.
KidsKilla
02.08.2005, 21:10
в любом случае ф-цию придётся каждый раз вызывать.
а шум зашел из-за того что не работает eval("x*x");
в честь чего каждый-то? при создании нового выражения - да. при вычислении одного и того же несколько раз - не обязательно.
Я думаю тебе нужно использовать Обратную польскую запись (http://trubetskoy1.narod.ru/ppn.html) :)
блин, действительно польскую :) склероз :(
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"
но по-моему удобнее просто передать функцию
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.