Как запустить внешнюю процедуру в OpenEdge Progress-4GL

Изучая OpenEdge Progress-4GL, я наткнулся на запуск внешних процедур и просто прочитал следующую строку кода, описывающую, как это сделать:

RUN p-exprc2.p.

Для человека, имеющего опыт программирования на C / C ++, Java и Delphi, это не имеет абсолютно никакого смысла: на этих языках существует множество процедур (функций), присутствующих во внешних файлах, которые необходимо импортировать, например:

filename "file_with_external_functions.<extension>"
===================================================
int f1 (...){
  return ...;
}

int f2 (...){
  return ...;
}

filename "general_file_using_the_mentioned_functions.<extension>"
=================================================================
#import file_with_external_functions.<extension>;
...
int calculate_f1_result = f1(...);
int calculate_f2_result = f2(...);

Другими словами: внешние процедуры (функции) означают, что вы составляете список процедур (функций), помещаете их все и, в случае необходимости, вы импортируете этот файл и запускаете процедуру (функцию), когда она вам нужна.

В Progress 4GL кажется, что вы запускаете весь файл!
Хотя это вообще не имеет смысла в C / C ++, Java, Delphi, я считаю, что это означает, что файлы процедур Progress (расширение * .p) должны содержать только одна процедура, а имя файла - это имя этой процедуры.

Это правильно, и в таком случае какой смысл ключевого слова PERSISTENT?

Заранее спасибо
Доминик


person Dominique    schedule 22.12.2020    source источник


Ответы (2)


Для оператора RUN существует множество вариантов: https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvref%2Frun-statement.html%23

Но в простом случае, если вы просто:

RUN name.p.

Вы вызываете процедуру. Он может быть внутренним, супер, постоянным или внешним. Это также может быть DLL ОС.

Интерпретатор сначала будет искать внутреннюю процедуру с этим именем. Таким образом:

procedure test.p.
  message "yuck".
end.

run test.p.

Запустит внутреннюю процедуру test.p. Локальная внутренняя процедура определяется в той же единице компиляции, что и оператор RUN. (Называть внутреннюю процедуру с помощью .p - это мерзость, не делайте этого. Я просто показываю это, чтобы прояснить, как RUN разрешает имена.)

Если локальная внутренняя процедура не найдена, то интерпретатор 4gl будет искать процедуру SESSION SUPER с этим именем. Они создаются при первом запуске процедуры PERSISTENT.

Если соответствующая внутренняя процедура или процедура SUPER не найдены, 4gl будет искать в PROPATH подходящую процедуру (сначала он будет искать скомпилированную версию, заканчивающуюся на .r), и, если она будет найдена, запустит ее.

Существуют более сложные способы запуска процедур с использованием дескрипторов и ключевого слова IN. Вы также можете передавать параметры и компилировать аргументы на лету. Документация выше описывает все это. Мой ответ просто охватывает простое имя RUN.

person Tom Bascom    schedule 22.12.2020

Изначально прогресс был реализован как процедурный язык, который делал это путем запуска программ. Это то, что вы видите с оператором run.

Если бы это было реализовано в OO, это выглядело бы примерно так:

НОВОЕ Имя программы (Конструктор, Параметр, Список).

Progress добавил поддержку объектно-ориентированной разработки, которая делает вещи более знакомыми вам.

person Tim Kuehn    schedule 23.12.2020