Natural では、プログラム内で直接定義されるインラインサブルーチンと、プログラム外で別のオブジェクトとして格納される外部サブルーチン(このチュートリアルで後述)という 2 種類のサブルーチンが区別されます。
#MARK という名前のユーザー定義変数にアスタリスク(*)を移動するインラインサブルーチンをプログラムに追加します。このサブルーチンは、従業員が 20 日以上の休暇を取った場合に起動されます。
以下の演習を完了すると、サンプルのアプリケーションは次の構造になります。

このドキュメントには次の演習が含まれています。
サブルーチンをプログラムに追加します。
サブルーチンを定義するには
ユーザー定義変数 #NAME-END の下に次の行を挿入します。
1 #MARK (A1)
この変数はサブルーチンで使用されます。したがって、最初に定義しておく必要があります。
サブルーチンを定義するため、END ステートメントの前に次の行を挿入します。
DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE
このサブルーチンが実行されると、アスタリスク(*)が #MARK に移動します。
注意:
ステートメント MOVE '*' TO #MARK の代わりに、ASSIGN または COMPUTE ステートメントの次の変形を使用することもできます。#MARK := '*'
DISPLAY ステートメントを次のように変更します。
DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
これにより、出力に新しい列が表示されます。見出しは ">=20" です。該当する従業員が 20 日以上の休暇を取った場合、列にアスタリスク(*)が表示されます。
インラインサブルーチンの定義が完了したので、インラインサブルーチンを実行するコードを指定できます。
インラインサブルーチンを実行するには
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
プログラムを実行します。
結果のマップで「"JONES"」と入力し、ENTER キーを押します。
従業員のリストに列が追加されて表示されます。
プログラムエディタに戻るには、MORE プロンプトで「EDIT」と入力します。
プログラムを格納します。
次の演習に進みます。処理ルールとヘルプルーチン