What Goes into a REXX Program (Rexxプログラムの構成要素)

いろんなプログラミング言語を使っている人だと, Rexx言語見て「ふーん, こーゆー言語ね」とか理解できるはずなんだけど, それでも一風変わった文が現われたりする。

どれが式で どこがインストラクション(あるいは命令, コマンド)なのか, つーか どーゆー種類のものがあるのか, それを見てこー。


Comments (注釈)

コメントは /**/ でくくる, それなりに一般的なもの ・・・ なんだけど, 少々違うのはネストできるってこと。 つまり二重三重にコメントアウトできる訳。 だから, プログラムの一部を一時的に機能しないよーにするときに便利かも。
ほかの言語での場合だと, 前後にソレを入れても プログラムの中のもともとあったコメントの部分, そこでコメント終了と判断されてしまったりするし, なかなかうまくいかない訳なのだ。

それから, 動作環境によってはプログラムファイル先頭にコメントが必要な場合もあったりする。 たとえば OS/2 Warpとか PC-DOSでは, Rexxのプログラムは *.cmdだったり *.batだったりするんだけど, それだとバッチファイルなのか Rexxプログラムなのか判断つかない。 このために そのファイルの先頭に /* 〜 */があれば Rexxプログラムってことになるのだ。
でも, ソレの必要のない Linuxでの Rexxであっても, そのプログラムの目的っちゅーか, プログラムを指して「なにコレ」と問われたときの答えを, そこに書いておくのはよいことかも。

ほかに, トークンの区切りとしてコメントを使えなくもない。だけど, あんましお勧めじゃないかも。

str = var_a/* この区切りは連結になる */var_b
parse var str var_a/* この区切りはスペースと同じ感じ */var_b

Keyword Instructions (キーワード命令)

if とか say とか do とか, そんな単語のこと。インストラクションなんつったりもするかも。
キーワード命令の一覧 見てみると, それなりにたくさんあったりもするけど, よく使うのはその一部になるのかも知れない。


Clauses (文節)

文節, てゆーか「文」てゆーか ・・・。ソレは, 実行する単位みたいなものカナ。 例えば, キーワード命令とパラメータをセットにしたよーなものとか, そんな感じ。
; で区切る単位と言えるのかも。で, ソレを指定していないか, ソレが行末に一つずつしかない場合は「一行」=「一文節」ってことになる訳だね。


Labels (ラベル)

ある文節, ソレが symbolとその後に続くコロン(:)で成り立っている場合, ラベルになる。 signalとか, callでの飛び先になる訳よ。
ラベルだけで一行にしてもよいし, 後ろに命令を置いてもよい。それに, ラベルを一行に複数置いても大丈夫。行の途中のラベルでも認識されるのだ。 なんか変な感じだね。

だから, トリッキーな使い方もできるんだけど, でも, あとで「コレ, 何やってんのか分からない」ってことになったらアレだから, 変な使い方はやめた方がよいかも。


Hexadecimal Strings (16進文字ストリング)

文字列を扱うときに, 扱いたいけど表現できないって場合があったりする。例えば復帰・改行文字 それからタブコードなんかもそう。 そんなときに使うのがコレ, 16進文字ストリング。

str = '文字列' || '0d0a'x   /* 復帰・改行文字を後ろに付ける */

使い方はこんな感じに xをつけるんだけど, プログラム中で x とゆー変数を使ったりすると なんだか紛らわしくなったりする。ので, 1文字の変数名と文字列とはあまりくっつけない方がよいかも。
ちなみに xで始まる変数名は, こんな場合でもちゃんと変数名として見てくれるっぽい。

str = '文字列' || '0d0a'x1   /* '文字列0d0aX1' になる (16進文字じゃない) */

関数でのソレは, x2c(〜)使うとよいかも。


Binary Strings (2進文字ストリング)

2進文字ストリングは, 16進文字ストリングを見れば分かる通り, ソレの 2進数版。 引用符の後ろに指定するのは b。てことで, 単にbってゆー変数名も, (紛らわしいから)できれば控えた方がよいかも。

関数でのソレは, x2c(b2x(〜))って感じで使うとよいかも。


Literal Strings (リテラル・ストリング)

リテラル・ストリングは文字ストリングを引用符('とか")でくくったもの。そこに書かれている固定の文字列。

"こんにちは"
'コレはリテラル・ストリング'

引用符は "と'の どちらでもまったく同じ。なので, C言語系のよーに文字列は「"」, 一文字の場合は「'」て感じで分けてる人や, すべて「'」で統一している人などさまざま。

リテラル・ストリングの中で引用符を使いたいとゆー場合は, もう片方の引用符で全体を囲むか, それとも囲んでいる引用符を連続で使うか になる。 囲んでいる引用符を連続で使う場合は, 2つ1組になるとゆー訳。ちなみに「\」を直前に置いても, そのまま文字列の一部になってしまうだけだよ。
それから, C言語系でよく使われる \n とか, 困ったことにそんなのは使えない。

"ここで改行する"'0d0a'x'改行しました。'   /* ← 改行する場合はこんな感じかな */
"文字列は 'で囲んでも ""で囲んでも大丈夫。"
'ここで''履物''を脱いで下さい'            /* ← ここで'履物'を脱いで下さい */

Numbers (数字)

普通に数字っぽいのが数字ってことになる。 けれど, 文字列のように見えて実は数字として扱うことができるってゆーのもある。
Rexxは, たぶんソレができた当初から型がなくて, そんな訳で後から追加したものじゃないから, 文字列も数字も同じよーに扱うことができるのだ。 そんな訳で ↓は有効な数字の例。

  123
"   3.141592   "
   -1.42857143e-11
' + 1.23 '

整数は 2バイトとか 4バイトくらいだから 値の範囲も 32767から -32768くらいで, たぶん桁数もそんな感じ ・・・ てことに普通は なりがちだけど, Rexxの数字にそんな制限はない。
何の指定もない場合は確かに 9桁とゆー制限があるんだけど, ソレは NUMERIC DIGITS instruction(=命令)の, そのデフォルトの値が 9になっているとゆーだけの話。 だから, ソレを 100とか 1000とか, 大きな値を指定すればそれだけ大きな, より精度の高い計算ができる, よーになるかも。 10/7とか 10/3みたいな, 誤差を起こしそーな計算に便利ってことだね。
問題があるとすれば, 誤差とひきかえに 少しだけ余計目に記憶域が使われること。 あとは, min(), max() みたいな built-in(=組み込み)関数はその影響を受けないこと, くらいかな。

ある目的, たとえば文字列の中から一部を取り出して演算してみる ・・・ そんな場合, 型がないから大丈夫ともゆってられない。 ソレが数字として 計算するのに有効かどーか調べる必要も出てきたりする。 そんなときには, datatype() 関数を使うとよいかも。その部分が数字かどーか, あるいは整数かどーか調べることができるので便利。


Implied Semicolons (暗黙のセミコロン)

文節の終わりにはセミコロン(;)を付けてもよいけど, 付けなくてもよい。 とゆーのも 行の終わりで自動的にセミコロンが付けられるから。
セミコロンを含める必要があるのは, 一行に複数の 文節があるときくらい。

if n == 1 then do; string = 'アレは 1です'; say string; end;

/* この場合, do の後にもセミコロンが必要 */
/* end の後には付けても付けなくてもよい  */

行の終わりのセミコロンは例外もあって, ソレは ・・・

  1. 注釈の途中の場合
  2. 継続文字(つまりコンマ(,)のこと) が行の最後のトークンの場合

継続文字の後にコメントがあっても継続は有効で, だからその場合には暗黙のセミコロンは付かない。 ・・・ んだけど, それほど気にする必要はないかも。

then, else, otherwise とゆーキーワードの後にも自動的に暗黙のセミコロンが付くんだけど, コレも気にする必要はないかも。 エラーが発生したときに, 付いたセミコロンを見ることができるんだけどね。


Continuations (継続)

Rexx言語はフリーフォーマットっつー訳ではない。 文節の区切りに ';'さえ付ければ, 一行に複数の文節を連ねたりすることができるけど, 一つの文節を複数行にまたがって書くことはできないのだ。そのままでは。
そこで登場するのが Continuations (=継続)。

if a = b,                       /* こんな風に使うことができる */
 & c = d                        /* ここに暗黙のセミコロン */
   then say 'a と bは等しく',
     'しかも c と dは等しい'    /* ここにも暗黙のセミコロン */

紛らわしいのは, 関数の引数の途中で継続する場合。 なぜって 引数の区切りもカンマだから, ソレが二つ続くことになったりして何だか分かりにくくなっちゃうから。


Expressions and Operators (式および演算子)