如何在 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 关键字的含义是什么?

提前致谢
多米尼克

解决方法

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 名称.p.

,

Progress 最初是作为一种过程语言实现的,它通过运行程序来完成它的工作。这就是您在“运行”语句中看到的内容。

如果要在面向对象中实现这一点,它看起来像这样:

新程序名称(构造函数、参数、列表)。

Progress 增加了对 OO 开发的支持,它以您似乎更熟悉的方式做事。