前章でユーザー定義命令・関数なるものを紹介しました。 今回は、ユーザー定義命令・関数のため似に用意されたプリプロセッサといっても過言ではない モジュール命令セットについて紹介します。 モジュールとは「機能単位、交換可能な構成部分という意味」の機能であり、 「ユーザが自由に追加機能を開発して公開したり、全体を入れ替えず機能強化するのに利用しているのが多い」 という風に某用語辞典では書かれています。 つまり…簡単に書くと「モジュールは使い回しができる小さな機能(パーツ)のこと」ということですね。 使い回しできる実際の処理部分は、#deffunc命令や#defcfunc関数の事を指していて、 前章の書き方でも、コピペするだけで使えないことはありませんが、 ユーザー定義命令・関数内部で使用する変数が、メインスクリプト内の変数と衝突してしまう恐れがあり、 重要な変数名とかぶらない様なユニークな名前を考えなければなりません。 自分の作成したユーザー定義命令・関数ならまだしも、他人のモノを流用する場合には 自分のメイン側の変数と同一でないかを確認しなければなりませんし、 逆に自分の作った汎用的な処理を第三者にも利用してもらえるように公開する場合も同様に、 ユーザー定義命令・関数内の変数名を熟考しなければなりません。 今回のHSPにおけるモジュールと言うのは、 ルーチン内部で使用している変数は元のプログラム内の変数と全く同一名であっても衝突することがなく、 メインスクリプト内の他所でも使用している同一名変数内容を書き換えてしまい予期せぬ不具合になる可能性 も下げてくれるというものです。 同じ変数名なのに全く別の変数として扱われる…? HSPの基本はBASIC言語と同じく、これから説明する概念をあまり意識せずに使うようになっているので 他のプログラム言語を知らない方にとっては理解しにくいことかもしれませんが、 変数には「スコープ」と呼ばれる有効範囲があり、 その範囲内においてのみ、特定の変数として認められるようになっているのです。 そのスコープ外においては、変数内容を参照することはおろか、 事前に変数を定義しなければ利用できない言語では書き込むこともできません。 前章にHSP3から登場したローカル変数というものを紹介したのを覚えていますか? #deffunc命令や#defcfunc関数のパラメータにlocalタイプ指定するというもののことですが、 このローカル変数と言うものは、ユーザー定義命令・関数の処理を終えて return命令で元の処理位置に戻る際に使えなくなるというタイプの変数でした。
1 2 3 4 5 6 7 8 9 | goto *@f #deffunc test local i i = "スコープのテスト" return *@ test mes i // エラーになる |
| #module モジュール名, 登録変数… | |||
| モジュール名 | 省略可能。モジュールに18文字以内の変数のような名称を付けることが出来る。 | ||
| 登録変数 | 省略可能。モジュールに関連付けられたローカルな変数を複数登録可能。 | ||
| #global | |||
| [パラメータなし] | モジュール終了を示すだけのためにパラメータは必要ない。 | ||
1 2 3 4 5 | #module mes "モジュール空間内です。" #global mes "グローバル空間です。" |
1 2 3 4 5 6 7 8 9 | #module mod #deffunc sample str msg mes "モジュール内での表示メッセージ" mes "「" + msg + "」\n" return #global sample "定義命令sampleに文字列を渡す" mes "モジュール外での表示メッセージ" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #module #deffunc varset tmp = 123 return #deffunc varshow mes tmp return #global tmp = "グローバルの変数" varset // 変数tmpを書き換える? mes tmp // 現在のtmpを表示 varshow // 現在のtmp(モジュール版)を表示 |
1 2 3 4 5 6 7 8 9 | #module #deffunc global_varset tmp@ = 123 return #global tmp = "グローバルの変数" global_varset // 変数tmpを書き換える? mes tmp // 現在のtmpを表示 |
1 2 3 4 5 6 7 8 9 10 | #module #deffunc varset tmp = 123 return #global tmp = "グローバルの変数" varset // 変数tmpを書き換える? mes tmp@m0 // 現在のtmp(モジュール版)を表示 mes tmp // 現在のtmp(グローバル版)を表示 |
1 2 3 4 5 6 7 8 9 10 11 12 | #module #defcfunc calc int value, int tax, local i if tax = 0 : i = 5 : else : i = tax return int(value * (i + 100) / 100) #global // 0 or 1 でサンプル部分の処理実行を制御する #if 1 total = 3200 mes "消費税込みの金額を表示します。" mes strf("%d円の税込額は%dです。", total, calc(total)) #endif |