如何找到调用过程的过程句柄?

How to find the procedure handle of the calling procedure?

我正在尝试编写一些测试程序,我想 运行 一个过程,并让该过程调用调用程序中的内部函数和过​​程。据我了解,您可以使用 RUN x IN y,其中 y 是调用堆栈中的任何过程。

但是,我似乎找不到任何方法来获取调用过程的句柄。似乎没有向上移动调用堆栈的方法。

我能想到的唯一方法是将调用过程的 THIS-PROCEDURE 句柄作为参数传递。它会工作,但似乎很不优雅。

你快到了。请看下面使用 THIS-PROCEDURE:INSTANTIATING-PROCEDURE 句柄的示例。

INSTANTIATING-PROCEDURE attribute

Returns the handle to the procedure in which an object was instantiated.

parentProgram.p

RUN childProgram.p.

PROCEDURE hello:
    DEFINE INPUT  PARAMETER pcMessage AS CHARACTER   NO-UNDO.
    MESSAGE "Child says:" pcMessage VIEW-AS ALERT-BOX INFORMATION.
END.

childProgram.p

MESSAGE "Calling parent. Anybody home?" VIEW-AS ALERT-BOX.

IF VALID-HANDLE(THIS-PROCEDURE:INSTANTIATING-PROCEDURE) THEN
    RUN hello IN THIS-PROCEDURE:INSTANTIATING-PROCEDURE (INPUT "I am your child") NO-ERROR.
IF ERROR-STATUS:ERROR THEN DO:
    MESSAGE "That didn't work" VIEW-AS ALERT-BOX ERROR.
END.

要获取调用过程的句柄,请使用 SOURCE-PROCEDURE 句柄。它具有 last 过程调用的句柄。如果另一个过程是 运行,那么它将更改以匹配该过程实例的句柄,因此如果您需要您的程序记住调用它的人,您的代码将需要在调用时立即存储该值。