インラインサブルーチン

Natural では、プログラム内で直接定義されるインラインサブルーチンと、プログラム外で別のオブジェクトとして格納される外部サブルーチン(このチュートリアルで後述)という 2 種類のサブルーチンが区別されます。

#MARK という名前のユーザー定義変数にアスタリスク(*)を移動するインラインサブルーチンをプログラムに追加します。このサブルーチンは、従業員が 20 日以上の休暇を取った場合に起動されます。

以下の演習を完了すると、サンプルのアプリケーションは次の構造になります。

Application structure

このドキュメントには次の演習が含まれています。


インラインサブルーチンの定義

サブルーチンをプログラムに追加します。

Start of instruction setサブルーチンを定義するには

  1. ユーザー定義変数 #NAME-END の下に次の行を挿入します。

    1 #MARK              (A1)

    この変数はサブルーチンで使用されます。したがって、最初に定義しておく必要があります。

  2. サブルーチンを定義するため、END ステートメントの前に次の行を挿入します。

    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE

    このサブルーチンが実行されると、アスタリスク(*)が #MARK に移動します。

    注意:
    ステートメント MOVE '*' TO #MARK の代わりに、ASSIGN または COMPUTE ステートメントの次の変形を使用することもできます。#MARK := '*'

  3. DISPLAY ステートメントを次のように変更します。

    DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK

    これにより、出力に新しい列が表示されます。見出しは ">=20" です。該当する従業員が 20 日以上の休暇を取った場合、列にアスタリスク(*)が表示されます。

インラインサブルーチンの実行

インラインサブルーチンの定義が完了したので、インラインサブルーチンを実行するコードを指定できます。

Start of instruction setインラインサブルーチンを実行するには

  1. DISPLAY ステートメントの前に次の行を挿入します。

    IF LEAVE-DUE >= 20 THEN
      PERFORM MARK-SPECIAL-EMPLOYEES
    ELSE
      RESET #MARK
    END-IF

    20 日以上の休暇を取った従業員が検出されると、MARK-SPECIAL-EMPLOYEES という名前の新しいサブルーチンが実行されます。従業員の休暇が 20 日未満の場合、#MARK のコンテンツは空白にリセットされます。

    プログラムは次のようになります。

    DEFINE DATA
    LOCAL
      1 #NAME-START        (A20)
      1 #NAME-END          (A20)
      1 #MARK              (A1)
      1 EMPLOYEES-VIEW VIEW OF EMPLOYEES
        2 FULL-NAME
          3 NAME (A20)
        2 DEPT (A6)
        2 LEAVE-DATA
          3 LEAVE-DUE (N2)
    END-DEFINE
    *
    RP1. REPEAT
    *
      INPUT USING MAP 'MAP01'
    *
      IF #NAME-START = '.' THEN
        ESCAPE BOTTOM (RP1.)
      END-IF
    *
      IF #NAME-END = ' ' THEN
        MOVE #NAME-START TO #NAME-END
      END-IF
    *
      RD1. READ EMPLOYEES-VIEW BY NAME
        STARTING FROM #NAME-START
        ENDING AT #NAME-END
    *    
        IF LEAVE-DUE >= 20 THEN
          PERFORM MARK-SPECIAL-EMPLOYEES
        ELSE
          RESET #MARK
        END-IF
    *
        DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
    *
      END-READ
    *
      IF *COUNTER (RD1.) = 0 THEN
        REINPUT 'No employees meet your criteria.'
      END-IF
    *
    END-REPEAT
    *
    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE
    *
    END
  2. プログラムを実行します。

  3. 結果のマップで「"JONES"」と入力し、ENTER キーを押します。

    従業員のリストに列が追加されて表示されます。

  4. プログラムエディタに戻るには、MORE プロンプトで「EDIT」と入力します。

  5. プログラムを格納します。

次の演習に進みます。処理ルールとヘルプルーチン