Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Команда XECUTE и форматированный код на выполнение / 12 сообщений из 12, страница 1 из 1
10.06.2014, 18:49
    #38666787
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
Есть вопрос, ответ на который я не нашел за 2 часа и решил спросить на форуме.
Для наших задач захотелось попробовать вызов команты XECUTE для выполнения кода бизнес-логики...

Функцияxecuteval(code,result,error)
  set idx=$increment(^wx)                  ; сперва формируем индекс idx для возвращение результата выполнения кода ^wx(idx)
  xecute "set idx="_idx_" "_code          ; перед кодом инициализируем индекс
  xecute "set result="_$get(^wx(idx))  ; после выполнения устанавливаем результат равным ^wx(idx)
  quit:$quit 0 quitПример выполнения: set result=1
 set error=1
 do xecuteval("set a=7 set a=a*5 set ^wx(idx)=a",.result,.error)После выполнения в result будет 35.

Зачем это мне - отдельный разговор. Просто захотелось...

А вопрос, на который я не нашел ответ - Как сделать вот так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
set result=1
set error=1
do xecuteval("
  set a=7
  set a=a*5
  set ^wx(idx)=a"
  ,.result,.error)

Уж не говоря об использовании в коде циклов и уровней выполнения...

Или спросите таки, зачем оно?
Я буду использовать функцию xecuteval в вызовах GT.M Call-In, для выполнения ее в C++ коде. И хочется, чтобы код на MUMPS был написан так как я пишу в файле - с переносами строк и уровнями " . ".
Код: plaintext
1.
2.
3.
4.
5.
gtmApi->XecuteVal("
  set a=7
  set a=a*5
  set ^wx(idx)=a
",result);


а не одной строкой...

У меня есть только одна мысль - реализовать на C++ "чистку" строки с кодом - отбрасывать переносы строк, например. Не знаю как получится с уровнями выполнения.

Может кто то делал подобное?
...
Рейтинг: 0 / 0
10.06.2014, 23:48
    #38666982
eduard93
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
SergeyLee, как вариант, можно использовать оператор конкатенации строк:
Код: plaintext
1.
2.
3.
4.
5.
gtmApi->XecuteVal(
"set a=7 "_
"set a=a*5 "_
"set ^wx(idx)=a",
result);


Выглядит, правда, не очень.
...
Рейтинг: 0 / 0
11.06.2014, 00:06
    #38666991
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
а почему бы просто не создавать временные программы и их исполнять. Думаю это будет сделать несложно и для gt.m
...
Рейтинг: 0 / 0
11.06.2014, 10:55
    #38667259
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
SergeyLeeКак сделать вот так?Никак: Syntax Rules (White Space)
...
Рейтинг: 0 / 0
11.06.2014, 11:24
    #38667315
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
DAiMor,

Собственно эта функция задумывается для "быстрой разработки кода на М, чтобы затем этот код оформить в функции"...
Правда начинаю уже думать, что лучше сразу писать функции, компилировать код и выполнять.

Общая схема такая примерно...
1. На фронтенде (PHP) используются функции разработанного нами расширения
2. Расширение собственно формирует запрос и передает его на бекенд (другой хост)
3. Бекенд получает запрос, обрабатывает его и передает на исполнение GT.M (посредством одной из 8-16 процессов, которые работают по Call-In фреймоворку от GT.M, тоесть выполняют код М в C++ коде)

И вот захотелось разработчику фронтенда перенести бизнес-логику на М. Я не могу разобраться в его PHP коде (точнее это страшно и у меня есть свои задачи), а он пока что не знает М. Вот и подумалось - сперва переписывать логику прямо в PHP функциях, вызывая код на М, проработать его и создать функцию на его основе, затем вызывать только функцию... Как то так.
...
Рейтинг: 0 / 0
11.06.2014, 11:28
    #38667321
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
eduard93,

спасибо! и не подумалось о простой конкатенации вчера)
...
Рейтинг: 0 / 0
11.06.2014, 12:33
    #38667446
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
DAiMorа почему бы просто не создавать временные программы и их исполнять. Думаю это будет сделать несложно и для gt.m

Хотя возможно Вы имели в виду такой алгоритм:
- строка кода передается (в виде строки или глобала) на бекенд - и здесь нет ограничения в 8192 байта для XECUTE в GT.M
- бекенд создает временный файл, скажем, _exec_000123.m и сохраняет код с форматированием как есть
- бекенд линкует этот файл и выполняет - здесь много проблем с ошибками как линкови, так и выполнения
...
Рейтинг: 0 / 0
11.06.2014, 12:43
    #38667459
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
SergeyLee,

Да возможно будут ошибки, но все эти ошибки будут связаны только с самим выполняемым кодом, и значит в нем есть ошибки, разве не так ? и все их сможет отловить бекенд и отправить фронтенду
...
Рейтинг: 0 / 0
11.06.2014, 12:47
    #38667462
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
DAiMorSergeyLee,

Да возможно будут ошибки, но все эти ошибки будут связаны только с самим выполняемым кодом, и значит в нем есть ошибки, разве не так ? и все их сможет отловить бекенд и отправить фронтенду

Все так, буду реализовывать сегодня-завтра. Спасибо за идею! :)
...
Рейтинг: 0 / 0
11.06.2014, 14:25
    #38667619
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
SergeyLee ,

Всё это в Caché решается проще через класс %Routine , нежели XECUTE .
...
Рейтинг: 0 / 0
17.06.2014, 20:15
    #38672341
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
Лучше бизнес логику создавать на сервере, а клиенту отправить строки(массивы)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
cmdDo(input)
 ;
 n flag,rtn,head,cik,i,nprm,array,data,ByRef
 s head=$p(input,$c(0))
 s rtn=$p(head,"~",1)       ; RoutineLabel^RoutineName
 s nprm=$p(head,"~",2)      ; nr.parameters
 s flag=$p(head,"~",3)      ; flag
 s lenAll=$p(head,"~",4)    ; len all  -It's not used
 s lenP1=$p(head,"~",5)     ; len par1 -It's not used
 s lenP2=$p(head,"~",6)     ; len par2 -It's not used
 s lenP3=$p(head,"~",7)     ; len par3 -It's not used
 s lenP4=$p(head,"~",8)     ; len par4 -It's not used
 s lenP5=$p(head,"~",9)     ; len par5 -It's not used
 s lenP6=$p(head,"~",10)    ; len par6 -It's not used
 s lenP7=$p(head,"~",11)    ; len par7 -It's not used
 s lenP8=$p(head,"~",12)    ; len par8 -It's not used
 s lenP9=$p(head,"~",13)    ; len par9 -It's not used
 s lenP10=$p(head,"~",14)   ; len par10 -It's not used
 s lenP11=$p(head,"~",15)   ; len par11 -It's not used
 s lenP12=$p(head,"~",16)   ; len par12 -It's not used
 s lenP13=$p(head,"~",17)   ; len par13 -It's not used
 s lenP14=$p(head,"~",18)   ; len par14 -It's not used
 s lenP15=$p(head,"~",19)   ; len par15 -It's not used
 s lenP16=$p(head,"~",20)   ; len par16 -It's not used
 ;
 ; Passing parameters ByRef lab^routine(.var1,.var2, ... .var16) return records or Array !!!
 s gtmbuild("gtmstring")=rtn_"("
 f i=2:1:nprm+1 d
 . s gtmbuild("ByRef",i)=$p(input,$c(0),i)
 . s ByRef=".ByRef"_i s gtmbuild("gtmstring")=gtmbuild("gtmstring")_(ByRef_","),passing="ByRef"_i,@passing=gtmbuild("ByRef",i)
 s $e(gtmbuild("gtmstring"),$l(gtmbuild("gtmstring")))=")"
 i nprm=0 s gtmbuild("gtmstring")=rtn ; with no parameter in function
 k i
 i flag="R" d
 . w ""_separator ; Return pseudo parameter ("")
 . n $zt s $zt=$$zt()
 . x "New gtmbuild Do "_gtmbuild("gtmstring")
 . s $zt=""
 . f i=2:1:nprm+1 d
 . . i $d(@("ByRef"_i))\10=0 w @("ByRef"_i)
 . . e  f cik=0:1 s array=$q(@("ByRef"_i_"("_cik_")")) q:array=""  w @array
 . . k @("ByRef"_i)
 . . w separator  ; Separator fragments
 i flag="F" d
 . n $zt s $zt=$$ztx()
 . x "New gtmbuild s ByRef=$$"_gtmbuild("gtmstring")
 . s $zt=""
 . w ByRef_separator
 . f i=2:1:nprm+1 d
 . . i $d(@("ByRef"_i))\10=0 w @("ByRef"_i)
 . . e  f cik=0:1 s array=$q(@("ByRef"_i_"("_cik_")")) q:array=""  w @array
 . . k @("ByRef"_i)
 . . w separator  ; Separator fragments
 w endfragment    ; END Separator
 w !
 q
 ;;

...
Рейтинг: 0 / 0
18.06.2014, 19:36
    #38673564
SergeyLee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Команда XECUTE и форматированный код на выполнение
Valeriu,

Ага, знакомое, mwire.m измененный Вами... :)
Я сделал попроще, но такой подход учту.
Только не совсем понятно в каком формате можно передавать строки, массивы? Как я понял Вы парсите их по $char(0), тоесть по концу строк.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Команда XECUTE и форматированный код на выполнение / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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