メニューボタン
IBMi海外記事2025.01.15

RPGで列挙型を使用する

Gregory Simmons 著

RPG言語では、列挙型を使用できるようになっています。ようやく、と言う人もいるかもしれませんが、列挙型は、IBM i 7.5 TR3およびIBM i 7.4 TR9で導入されています。

免責事項:このテスト プログラムでは、キノコの可食性について取り扱われていますが、これは、あくまでプログラムの動作の仕組みを分かりやすく説明するためのものです。キノコの可食性については、ミズーリ州自然保護局(MDC)発行の「 A Guide to Missouri's Edible and Poisonous Mushrooms(ミズーリ州の食べられるキノコと毒キノコのガイドブック)」を参考にしましたが、実際に野生のキノコ類を採取したり摂取したりする際は、事前にご自身で十分に調べて、安全性が確保されるようにしてください。

では、早速ですが、コード サンプルを見てみましょう。まずは、簡単な リニア メイン プログラムです。近頃では、サービス プログラム向けのモジュールでRPGを書いていない場合は、必ずリニア メイン プログラムにあります。そして、必ず、**Freeから始めます。

**Free
Ctl-Opt Main(enum_test) ActGrp(*Caller);

Dcl-Proc enum_test;

  Dcl-Enum edible_mushrooms Qualified;
    morel 'Morel';
    chanterelle 'Chanterelle';
    portobello 'Portobello';
    chicken_of_the_woods 'Chicken of the Woods';
  End-Enum;

  Dcl-s mushroom Char(20);

  Dsply ('Edible mushrooms:');

  For-each mushroom in edible_mushrooms;
    Dsply (mushroom);
  EndFor;

  Return;

End-Proc enum_test;

上の例では、列挙型「edible_mushrooms」を定義しています。Qualifiedを指定し、食べられるとされている4種類のキノコの名前を指定しています。Qualifiedキーワードは必須ではありませんが、列挙型(データ構造と同様に)は、常にQualifiedキーワードを指定して定義するべきだと私は思います。コードの可読性を高める(これは私が重要だと考えていることです)ために、コードを読む人に、どの構造(列挙型、データ構造、または配列)が参照されているか正確に知らせたいと思っているからです。

また、列挙型「edible_mushrooms」内のそれぞれの「mushroom」(キノコ)を繰り返し処理するfor-eachループも実装しています。このループ内で、簡単な例としてそれぞれの食べられるキノコを表示していますが、列挙型とfor-each命令を組み合わせるとどのように有用なのかをお分かりいただけたら幸いです。

上のプログラムを実行すると、出力は以下のようになります。

ある命令(ここではDSPLY命令)でmushroomが使用されるときには、それぞれの列挙子に割り当てられているテキストが利用される点に注目してください。

次に、ある1つの値が列挙型の中にあるかどうかテストする2つの方法について見てみましょう。

**Free
Ctl-Opt Main(enum_test) ActGrp(*Caller);

Dcl-Proc enum_test;

  Dcl-Enum edible_mushrooms Qualified;
    morel 'Morel';
    chanterelle 'Chanterelle';
    portobello 'Portobello';
    chicken_of_the_woods 'Chicken of the Woods';
  End-Enum;

  Dcl-s mushroom Char(20) Inz('False Morel');

  If mushroom in edible_mushrooms;
    Dsply (%Trim(mushroom) + ': This mushroom is edible');
  Else;
    Dsply (%Trim(mushroom) + ': This mushroom is NOT edible');
  Endif;

  Return;

End-Proc enum_test;

上の例では、単純なIfステートメントと、mushroomの値が列挙型の中にあるかないかを表示するアクションをコーディングしています。このプログラムを実行すると、以下のようになります。

最後に、もうひとつの例を見てみましょう。こちらでは、Selectステートメントを使用しています。まだご存じでないという方に向けてお伝えしておきますが、しばらく前に、 RPG Select命令は魅力的にアップグレード されています。

**Free
Ctl-Opt Main(enum_test) ActGrp(*Caller);

Dcl-Proc enum_test;

  Dcl-Enum edible_mushrooms Qualified;
    morel 'Morel';
    chanterelle 'Chanterelle';
    portobello 'Portobello';
    chicken_of_the_woods 'Chicken of the Woods';
  End-Enum;

  Dcl-s mushroom Char(20) Inz('False Morel);

  Select %Trim(mushroom);
    When-in edible_mushrooms;
      Dsply (%Trim(mushroom) + ': This mushroom is edible');
    Other;
      Dsply (%Trim(mushroom) + ': This mushroom is NOT edible');
  EndSl;

  Return;

End-Proc enum_test;

このバージョンを実行しても、同じ出力になります。

こうした新しい機能を習得するには、訓練が必要です。これらのコード サンプルをダウンロードし、コンパイルして実行し、デバッグしてそれらがどのように動作するか確認してみることをお勧めします。

あわせて読みたい記事

PAGE TOP