単純ですが、構造的に嫌悪感を抱く解決策は、グローバル共有変数を使用することです。
多くの人が、これは悪いコーディング手法だと言うでしょう。彼らは正しい。しかし、あなたはベスト プラクティスに関するアドバイスを求めているわけではありません。
呼び出し元と呼び出し先の両方でそのような変数を作成するだけです。それを必要としない手順は、それを見逃すことはありません。
あなたの「通常の」プログラムの1つ:
/* p1.p */
message "p1, I'm normal.".
run common.p.
あなたの「特別な」プログラム:
/* p2.p */
define new global shared variable special as character no-undo.
message "p2, I'm special!".
run common.p.
message "special = " special.
共通プログラム:
/* common.p */
define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.
NEW GLOBAL SHARED 変数は何度でも定義でき、そのコピーは 1 つしか取得できません。「new」は既存の変数を上書きしません (GLOBAL を省略すると、動作が異なります)。
あなたはそれを要求しませんでしたし、おそらくそれを必要としないかもしれませんが、program-name(2) チェックはコール スタックを調べて、common.p が p2.p によって呼び出されたかどうかを確認します。
これを行うには他にももっと複雑な方法がありますが、それらはすべて同じ問題に帰結します。つまり、「特別な」プログラムと、もはや一般的ではない「共通の」プログラムとの間の非常に醜い結合の基礎を作成しているのです。