powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Команда XECUTE и форматированный код на выполнение
12 сообщений из 12, страница 1 из 1
Команда XECUTE и форматированный код на выполнение
    #38666787
SergeyLee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вопрос, ответ на который я не нашел за 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
Команда XECUTE и форматированный код на выполнение
    #38666982
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeyLee, как вариант, можно использовать оператор конкатенации строк:
Код: plaintext
1.
2.
3.
4.
5.
gtmApi->XecuteVal(
"set a=7 "_
"set a=a*5 "_
"set ^wx(idx)=a",
result);


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

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

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

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

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

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

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

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

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

Всё это в Caché решается проще через класс %Routine , нежели XECUTE .
...
Рейтинг: 0 / 0
Команда XECUTE и форматированный код на выполнение
    #38672341
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше бизнес логику создавать на сервере, а клиенту отправить строки(массивы)
Код: 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
Команда XECUTE и форматированный код на выполнение
    #38673564
SergeyLee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,

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


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