Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 $compile  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 318
Наткнулся в доке на красивую функцию - $compile.
Пример:
SourceCode
  SET src(0)=4
  SET src(1)="TestA "
  SET src(2)=" WRITE ""Hello "" "
  SET src(3)=" WRITE ""World"",!"
  SET src(4)=" QUIT"
CompileSource
  SET stat=$COMPILE(src,0,errs,TestA)
  IF stat=0 {WRITE "Compile successful" }
  ELSE {WRITE "status=",stat,!
        WRITE "number of compile errors=",$LISTLENGTH(errs) }

В переменной TestA получаем многострочный объектный код, соответствующий структуре SourceCode.
Хочется сохранить его в базе, и выполнять по мере надобности.
Но xecute не может выполнить этот код:
USER>x TestA
 
X TestA
^
<SYNTAX>

Xecute может выполнить только одну строку М-кода:(

Предложение: расширить возможности команды Xecute :
- выполнять многострочный код;
- выполнять многострочный объектный код;

П.С. Согласен, если многострочный объектный код будет выполнять команда DO, что-то вроде do @TestA.

П.П.С.Можно, конечно, сохранять объектный код, как объектную программу. Я сейчас генерирую
программы с помощью класса %Routine. Мне не нравится, что в списке int-программ сотни модулей по паре строк в каждом.
Причем, имена у них сгенерированы автоматически, типа: pOT01SKVXo0Xm22Xc3Xd20150201.
28 июл 17, 14:17    [20682783]     Ответить | Цитировать Сообщить модератору
 Re: $compile  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1102
DirksDR,

Как вариант - все рутины генерировать с одним предопределенным именем, скажем TEMPCOMPILE, компилировать как рутину, полученный объектный код из ^rOBJ("TEMPCOMPILE") сохранить себе.
Для выполнения его вставить скажем в ^rOBJ("TEMPEXEC") и выполнять рутину d ^TEMPEXEC.
Для выполнения исходники (INT) не нужны, можно удалить.
28 июл 17, 22:57    [20684154]     Ответить | Цитировать Сообщить модератору
 Re: $compile  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3522
ну я,

А интерфейс %Library.Routine не удобнее будет для этого?
29 июл 17, 07:08    [20684547]     Ответить | Цитировать Сообщить модератору
 Re: $compile  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 318
Мне казалось, я в этот пост в топик "новые фичи" запостил. Не годится?
ИМХО, не очень сложная доработка. Раз Cache выполняет объектный код из глобали ^rOBJ("TEMPEXEC"),
почему бы не выполнить такой же код из глобали, скажем, ^MyObj(ObjType, AtrType, Date).

ну я,

Из соображений производительности не хочется гонять объектный код из глобали в глобаль, чтобы выполнить как программу.
В описании функции $compile сказано, что она может сохранять код сразу в ^rOBJ.
Надо проверить, будет ли формироваться int-модуль, почему-то думаю, что не должен.
31 июл 17, 07:38    [20686700]     Ответить | Цитировать Сообщить модератору
 Re: $compile  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 318
DirksDR,

Действительно, в ^rOBJ записывается, а в ^ROUTINE - нет. Попробую использовать, как вариант.
31 июл 17, 15:22    [20688591]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить