Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вычисление пользовательских выражений / 24 сообщений из 24, страница 1 из 1
13.01.2007, 19:07
    #34253630
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Гуру, подскажите есть для Cache возможность вычислять пользовательские выражения?

Например есть строка "2 * myVar" (здесь myVar это доступное на момент вычисления имя) и я бы хотел хотел иметь чтото типа $$Calc ( Formula )

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

Для чего нужно? В нашем предыдущем (не Сache) проекте формулы для вычислений задаются пользователем (ну или если хотите DataModelAdministrator'ом) на более менее понятном языке, который потом разбирается, компиляется в псевдо код и может выполнятся.
При этом имена типа Sales меняются на внутренние "ссылки" или данные и т.п. Аналогично с функциями.

Т.е. расчетная прикладная логика выносится из кода в пользовательские данные.

А как подобный подход можно реализовать в Cache?
...
Рейтинг: 0 / 0
13.01.2007, 19:36
    #34253662
MX -- ALEX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
StplГуру, подскажите есть для Cache возможность вычислять пользовательские выражения?

Например есть строка "2 * myVar" (здесь myVar это доступное на момент вычисления имя) и я бы хотел хотел иметь чтото типа $$Calc ( Formula )

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

Для чего нужно? В нашем предыдущем (не Сache) проекте формулы для вычислений задаются пользователем (ну или если хотите DataModelAdministrator'ом) на более менее понятном языке, который потом разбирается, компиляется в псевдо код и может выполнятся.
При этом имена типа Sales меняются на внутренние "ссылки" или данные и т.п. Аналогично с функциями.

Т.е. расчетная прикладная логика выносится из кода в пользовательские данные.

А как подобный подход можно реализовать в Cache?


я не гуру но все же

Например

Calc(xxxxxxxx) s $ZTRAP="xxxError^XXX" n qqqqqqqq x "s qqqqqqqq="_xxxxxxxx q qqqqqqqq

эту строку вставить в Вашу программу XXX
...
Рейтинг: 0 / 0
13.01.2007, 20:34
    #34253708
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
упс... надо попробовать, хотя для новичка вначале потребуется небольшая расшифровка :)
Спасибо!
...
Рейтинг: 0 / 0
14.01.2007, 00:37
    #34253852
MX -- ALEX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stplупс... надо попробовать, хотя для новичка вначале потребуется небольшая расшифровка :)
Спасибо!

если на вход подавать не строго MUMPS-выражение
то в эту программу надо вставить предварительное преобразование
его в M-код
...
Рейтинг: 0 / 0
14.01.2007, 02:35
    #34253904
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stplупс... надо попробовать, хотя для новичка вначале потребуется небольшая расшифровка :)
Спасибо!
Ну, выглядит все следующим образом. Вариантов несколько:
1. Вы можете передавать в программу любые выражения, естественно правильного синтаксиса, на
выполнение. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
Calc(expression)      ;функция вычисления выражения
         Xecute "Set MyVar = "_expression ; если expression вида "14.1244 ^ 3.14"
         Xecute expression ; если expresion вида "Set MyVar = 14.1244 ^ 3.14"
         Set @("MyVar = "_expression) ; если expression вида "14.1244 ^ 3.14"
         Set MyVar = @expression       ; аналогично
         ....

Вызывается это дело, конечно, $$Calc(expression)
...
Рейтинг: 0 / 0
14.01.2007, 10:17
    #34253945
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Всем спасибо!!!!!!!
Сергей, отдельная благодарность за понимание боли начинающего!!! :)

а кстати насколько я "чувствую" эту систему, Xecute вероятно работает довольно быстро, т.е. грандиозных задержек на "evaluating the expression" вероятно нет? (разумеется это зависит от его сложности, но я сравниваю Xcecute с обычной компиляцией и выполнением M кода)
...
Рейтинг: 0 / 0
14.01.2007, 18:39
    #34254291
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Следует только ограничить пользователей - ибо сразу потенциальная дырка в системе.

Запрет на употребление команду kill и использование ^ - а то напишуть kill ^oddMAC и привет
...
Рейтинг: 0 / 0
14.01.2007, 22:58
    #34254451
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
StplВсем спасибо!!!!!!!
Сергей, отдельная благодарность за понимание боли начинающего!!! :)

а кстати насколько я "чувствую" эту систему, Xecute вероятно работает довольно быстро, т.е. грандиозных задержек на "evaluating the expression" вероятно нет? (разумеется это зависит от его сложности, но я сравниваю Xcecute с обычной компиляцией и выполнением M кода)
Не за что, всегда рад помочь. :) А вот насчет Xecute ты ошибаешься, он работает в 3 раза медленнее. Да оно и понятно, собираем выражение, потом его компилируем, а уж потом выполняем.
...
Рейтинг: 0 / 0
14.01.2007, 23:32
    #34254474
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
3 раза это с одной стороны много с другой... надо пробовать.

Кстати а есть возможность в проге сгенерить М-код, создать из него например рутину, скомпилить ее и т.п. Т.е. можно ли клинту на сервере поставить и компилятор не нарушая лицензионных соглашений? Или он там и так будет?
...
Рейтинг: 0 / 0
14.01.2007, 23:38
    #34254480
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stpl3 раза это с одной стороны много с другой... надо пробовать.

Кстати а есть возможность в проге сгенерить М-код, создать из него например рутину, скомпилить ее и т.п. Т.е. можно ли клинту на сервере поставить и компилятор не нарушая лицензионных соглашений? Или он там и так будет?
Если гнаться за скоростью, то лучше не использовать.
Конечно есть.
Не совсем понял. Конечно на сервере уже есть компилятор. А зачем он клиенту если программа выполняется на сервере?
...
Рейтинг: 0 / 0
14.01.2007, 23:41
    #34254481
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
PtnСледует только ограничить пользователей - ибо сразу потенциальная дырка в системе.
Запрет на употребление команду kill и использование ^ - а то напишуть kill ^oddMAC и привет
Разумеется. На самом деле они будут писать на "нашем" языке в "наших" терминах из которых будет генерится М-код. Т.е. у нас будет свой парсер, м-построитель знающий о наших внутренних данных и т.п. Сами понимаете предположить что клиент должен/может осваивать М это из области фантастики :)
...
Рейтинг: 0 / 0
14.01.2007, 23:45
    #34254485
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stpl PtnСледует только ограничить пользователей - ибо сразу потенциальная дырка в системе.
Запрет на употребление команду kill и использование ^ - а то напишуть kill ^oddMAC и привет
Разумеется. На самом деле они будут писать на "нашем" языке в "наших" терминах из которых будет генерится М-код. Т.е. у нас будет свой парсер, м-построитель знающий о наших внутренних данных и т.п. Сами понимаете предположить что клиент должен/может осваивать М это из области фантастики :)
Я понимаю конечно. Пример "нашего языка" можно увидеть?
...
Рейтинг: 0 / 0
14.01.2007, 23:47
    #34254487
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Sergei ObrastsovЕсли гнаться за скоростью, то лучше не использовать.
надо попробовать.

Sergei ObrastsovКонечно есть.
Не совсем понял. Конечно на сервере уже есть компилятор. А зачем он клиенту если программа выполняется на сервере?
О, класс.
а Клиент в этом случай это покупатель. Т.е. пользователь с клиентской машины описывает свою модель вычислений, наша серверная часть генерит М, компиляет ее на сервере и т.п. после чего вроде все в шоколаде :)

усе, спасибо всем! беру таймаут, надо читать дальше доку...
...
Рейтинг: 0 / 0
14.01.2007, 23:53
    #34254488
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Sergei ObrastsovПример "нашего языка" можно увидеть?
простейший случай для фрагментов вычисляемы выражений:
{Sales,Actual,PrevPeriod}*1.1
Или
Trend(Sales,"Concern",2003-2006)
или
iif ( IsCurrentBusinessUnit() == "Concern", "Actual", "Actual,Concern)"
и т.п.
В текущем проекте юзера (DataModelAdministrators) пишут такие формулы что я просто не понимаю как они в них разбираются, при том что у нас руки так и дошли сделать красивый ExpressionBuilder. В параллельный проект мы его уже включили а здесь все некогда
...
Рейтинг: 0 / 0
15.01.2007, 07:26
    #34254620
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stpl PtnСледует только ограничить пользователей - ибо сразу потенциальная дырка в системе.
Запрет на употребление команду kill и использование ^ - а то напишуть kill ^oddMAC и привет
Разумеется. На самом деле они будут писать на "нашем" языке в "наших" терминах из которых будет генерится М-код. Т.е. у нас будет свой парсер, м-построитель знающий о наших внутренних данных и т.п. Сами понимаете предположить что клиент должен/может осваивать М это из области фантастики :)

Вот вот - и это правильно!

По поводу скорости могу сказать так. Раз есть свой язык и парсер его - то достаточно на выходе формировать не только строку, но и сразу компилять из нее рутину - для соотвествующего "отчета".

Тогда скорость будет терятся в основном только на вызове функции из этой рутины
...
Рейтинг: 0 / 0
15.01.2007, 07:28
    #34254622
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
+ если что не так в выражении - компилятор ругнется сразу, а не в момент выполнения.
...
Рейтинг: 0 / 0
15.01.2007, 08:21
    #34254651
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Ptn+ если что не так в выражении - компилятор ругнется сразу, а не в момент выполнения.
Ну, если у них свой парсер, то они и так обнаружат ошибку :)
...
Рейтинг: 0 / 0
15.01.2007, 09:11
    #34254703
MX -- ALEX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Sergei Obrastsov Stpl PtnСледует только ограничить пользователей - ибо сразу потенциальная дырка в системе.
Запрет на употребление команду kill и использование ^ - а то напишуть kill ^oddMAC и привет
Разумеется. На самом деле они будут писать на "нашем" языке в "наших" терминах из которых будет генерится М-код. Т.е. у нас будет свой парсер, м-построитель знающий о наших внутренних данных и т.п. Сами понимаете предположить что клиент должен/может осваивать М это из области фантастики :)
Я понимаю конечно. Пример "нашего языка" можно увидеть?

например в нашем проекте пользователь-клиент в любом месте выданного
на экран документа вводит

транспорт..

и в ответ система находит в этом документе все слова содержащие
"транспорт" в любом регистре букв и навешивет на них ссылки по эстафете -
рисует на каждом руку с пальчиком - для удобного и быстрого просмотра
этой темы

естественно
это все реализуется путем автоматического построения соответствующего
м-кода и затем его выполнения на м-сервере

кстати насчет X-команд - применяем в массовом порядке и везде .
замедления не чувствуется - ведь в основном это одноразовые программки
...
Рейтинг: 0 / 0
15.01.2007, 09:44
    #34254756
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
MX -- ALEXкстати насчет X-команд - применяем в массовом порядке и везде .
замедления не чувствуется - ведь в основном это одноразовые программки
Если речь идет о диалоговой работе с пользователем, то разницы конечно нет, полсекунды там
теряется или 6 :) Беда в том, что Xecute любят совать всюду, особенно в обработку данных.
...
Рейтинг: 0 / 0
15.01.2007, 09:59
    #34254796
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
раз уж тема вызвала столько откликов, пробегусь я впереди паровоза... (еще не пытался читать про это доку)
Как из моего кода (скорее всего не М), скомпилировать сгенеренную на сервере рутину? Может в Cache есть например готовый веб сервис куда можно передать текст и т.п. рутины а он все сделает? Или может есть объектный доступ к таким вещам?
...
Рейтинг: 0 / 0
15.01.2007, 10:05
    #34254814
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Sergei Obrastsov Ptn+ если что не так в выражении - компилятор ругнется сразу, а не в момент выполнения.
Ну, если у них свой парсер, то они и так обнаружат ошибку :)

А ошибку в парсере ;)
...
Рейтинг: 0 / 0
15.01.2007, 10:09
    #34254823
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Stplраз уж тема вызвала столько откликов, пробегусь я впереди паровоза... (еще не пытался читать про это доку)
Как из моего кода (скорее всего не М), скомпилировать сгенеренную на сервере рутину? Может в Cache есть например готовый веб сервис куда можно передать текст и т.п. рутины а он все сделает? Или может есть объектный доступ к таким вещам?

Готового нет - но сделать его не сложно. Главное получить параметры.
А дальше ... (пример из документации)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	Set routine = ##class(%Routine).%New("MyRoutine.MAC")
	; Write lines of code to the routine
	Do routine.WriteLine("MyRoutine")
	Do routine.WriteLine("Tag()")
	Do routine.WriteLine(" Write ""This is my routine"",!")
	Do routine.WriteLine(" Quit")
	; save the routine
	Do routine.Save()
	; compile the routine
	Do routine.Compile()
	; close the routine object
	Do routine.%Close()
...
Рейтинг: 0 / 0
15.01.2007, 10:13
    #34254841
Stpl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Йес!!! Спасибо еще раз!!!
похоже эта система вызывает у меня все больший интерес :)
...
Рейтинг: 0 / 0
15.01.2007, 10:46
    #34254927
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление пользовательских выражений
Ptn Sergei Obrastsov Ptn+ если что не так в выражении - компилятор ругнется сразу, а не в момент выполнения.
Ну, если у них свой парсер, то они и так обнаружат ошибку :)

А ошибку в парсере ;)
Ну, это уже несерьезно. Парсер, по определению, без явных ошибок :)
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вычисление пользовательских выражений / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]