EVALについて

おはようございます。
皆さんはIBM iのRPGで、変数への代入や計算をどのように記述していますか?
従来のRPGでは、処理内容に応じてMOVE、MOVEL、ADD、SUB、MULT、DIVなど、さまざまな命令を使い分ける必要がありました。
しかしRPG IVではEVAL命令が登場し、代入や演算処理をより柔軟に記述できるようになりました。
今回は、そんなEVALについて紹介したいと思います。
・EVALで計算をシンプルに
例えば、4を足し、1を引き、2を掛け、3で割った計算結果を変数にセットする場合を考えてみます。
従来の演算命令では、処理を一つずつ分けて記述する必要があります。
ここではWKSNSUを整数2桁、小数0桁の数値項目として定義しています。
C Z-ADD *ZERO WKSNSU 2 0
C ADD 4 WKSNSU
C SUB 1 WKSNSU
C MULT 2 WKSNSU
C DIV 3 WKSNSU
この処理の結果、WKSNSUには2がセットされます。
一方、EVALを使用すると、同じ処理を1つの式として記述できます。
C EVAL WKSNSU = ((4 – 1) * 2) / 3
この場合も、WKSNSUには2がセットされます。
数式をそのまま記述できるため処理内容も分かりやすくなり、コード量も少なくなります。
とても便利で楽ですね。これからはEVALだけで良い気がしてきました。
・EVALで文字列の代入
続いて、文字列を代入する場合を見てみます。
まずは従来のMOVEとMOVELの動きから見てみましょう。
ここではWKMOJIを10桁の文字列項目として定義しています。
C MOVE ’ABC’ WKMOJI 10
MOVEは右寄せで転送されるため、WKMOJIには’ ABC’がセットされます。
C MOVEL ’ABC’ WKMOJI
MOVELは左寄せで転送されるため、WKMOJIには’ABC ‘がセットされます。
それではEVALを使ってみます。
C EVAL WKMOJI = ‘ABC’
EVALを使うと、WKMOJIには’ABC ‘がセットされました。
……MOVEと同じ動きが出来ない!!
EVALだけで良い気がしていましたが、どうやらRPGはそこまで甘くないようです。
さらにEVALを使う際には、文字列の扱い以外にも注意しておきたいポイントがあります。
・EVALを使う際の注意点
整数2桁、小数0桁のWKDAMEという数値項目を定義しました。そこに1234を代入してみます。
C Z-ADD *ZERO WKDAME 2 0
C EVAL WKDAME = 1234
WKDAMEは2桁の数値項目です。
そのため、1234のように格納できる範囲を超えた値を代入すると、実行時にエラーとなる場合があります。
また、複雑な計算式では演算順序にも注意が必要です。
例えば「A = B + C * D」の場合、先に掛け算が行われます。
意図した計算結果にするためにも、必要に応じて括弧を使用して処理内容を明確にすることが大切です。
EVALは非常に便利な命令ですが、従来と完全に同じ動作をするわけではありません。
では、文字列を加工したり、細かな操作を行ったりしたい場合はどうすればよいのでしょうか。
そこで登場するのが組み込み関数(Built-In Functions:BIF)です。
・組み込み関数(BIF)について
組み込み関数とは、RPGにあらかじめ用意されている便利な関数です。
文字列の切り出しや結合、文字数の取得、日付計算、数値変換など、さまざまな処理を簡潔に記述できます。
例えば、文字列の一部を取り出す%SUBSTや、前後の空白を取り除く%TRIMなどがあります。
今回は詳しく紹介しませんが、EVALとBIFを組み合わせることで、文字列操作もより柔軟に記述できます。
BIFについては次回、詳しく紹介したいと思います。
・まとめ
いかがでしたか?
今回はIBM iのRPGにおけるEVALについて紹介しました。
EVALは、代入や計算をシンプルに記述できる便利な命令です。
一方で、MOVEやMOVELとは動作が異なる部分もあり、EVALだけですべての処理を置き換えられるわけではありません。
そんなときに役立つのが、今回少しだけ登場した組み込み関数(BIF)です。
EVALとBIFを組み合わせることで、計算だけでなく文字列操作なども、より柔軟に記述できるようになります。
次回は、文字列操作などで活躍するBIFについて、もう少し詳しく紹介したいと思います。

