同じような処理を行うサブルーチン(関数)をまとめることをモジュール化といいます。
- 構文
- MODULE モジュール名
CONST 変数
PUBLIC 変数
DIM 変数
PROCEDURE モジュール名
PROCEDURE 関数名( )
FUNCTION 関数名( )
ENDMODULE
CLASS
CONST 変数
PUBLIC 変数
DIM 変数
PROCEDURE クラス名
PROCEDURE 関数名( )
FUNCTION 関数名( )
ENDCLASS
- 引数
- 戻り値
モジュールとは
モジュールとはプログラムにおいて特定の機能を持ったひとまとまりの構成要素(部品)のことを指します。
例えばPythonでは、数学計算用の関数を集めたmathモジュール、日付や時間を扱うdatetimeモジュールなどがあります。
モジュールは入れ子(ネスト)することはできませんが、関数名に.(ピリオド)をつけることで階層化したように見せる書き方はできます。
MODULE Cipher
MODULE Caesar
FUNCTION encode()
RESULT = ""
FEND
FUNCTION decode()
RESULT = ""
FEND
ENDMODULE
ENDMODULE
Cipher関数 (自作関数)では、モジュール名がCipher、関数名にCaesar.encodeとCaesar.decodeで入れ子したような書き方をしています。
このような書き方をすることでCipher.Caesar.encode()、Cipher.Caesar.decode()というメソッドが使えるようになります。
MODULE Cipher
FUNCTION Caesar.encode()
RESULT = ""
FEND
FUNCTION Caesar.decode()
RESULT = ""
FEND
ENDMODULE
ただ注意が必要なのはあくまでCaesar.encode、Caesar.decodeというひとかたまりで関数名で.がモジュール名とメソッドの区切りを表しているわけではないので、このピリオドで区切りWITH文で書くということはできません。
WITH Cipher.Caesar
PRINT .encode()
PRINT .decode()
ENDWITH
モジュール名と関数名を分けることはできます。
WITH Cipher
PRINT .Caesar.encode()
PRINT .Caesar.decode()
ENDWITH
使い方
モジュール内にある変数・関数・モジュール名を呼び出すには以下のように書きます。
モジュール名.変数
モジュール名.モジュール名
モジュール名.関数名([引数], ...)
CONSTまたはPUBLICで宣言されたものは、モジュール名.変数で外部からも呼び出すことができます。
自モジュール内の変数、関数には自モジュールを示すTHIS.を付けてのアクセス可。
モジュール内からモジュール外関数を使う場合にGLOBAL.関数名にて明示可。
DIMで宣言されたものは、外部からアクセスすることはできません。
モジュール内の関数から同一モジュール内の関数を呼び出すときモジュール名は省略できます。
コンストラクタ
モジュール名と同じ関数は コンストラクタ として機能します。コンストラクタはインスタンス生成時に自動的に呼び出されるメソッドで、メンバを初期化するときによく使われます。モジュール内のすべての関数で共通する初期処理を記述する使い方もできます。
以下はclassNameというモジュール名で、同一のメソッドが実行されコンストラクタという文字列が出力されます。関数1と関数2はコンストラクタではないので出力されません。
MODULE className
PROCEDURE className
PRINT "コンストラクタ"
FEND
PROCEDURE func1()
PRINT "関数1"
FEND
PROCEDURE func2()
PRINT "関数2"
FEND
ENDMODULE
- 結果
コンストラクタ
モジュールの書き方
以下のプログラムは、Pythonのmathモジュールの一部をUWSCで書いてみた例です。
PRINT math.pi
PRINT math.e
PRINT math.tau
PRINT math.fabs(-4)
PRINT math.factorial(5)
MODULE math
// 円周率π
CONST pi = 3.14159265358979323846
// 自然対数e
CONST e = 2.71828182845904523536
// τ(τ=2π)
CONST tau = THIS.pi * 2
// 引数の絶対値を返す
FUNCTION fabs(x)
RESULT = ABS(x)
FEND
// 引数の階乗を返す
FUNCTION factorial(x)
IF x <> ABS(INT(x)) THEN RESULT = ERR_VALUE
IFB x = 0 OR x = 1 THEN
RESULT = 1
ELSE
RESULT = x * factorial(x - 1)
ENDIF
FEND
ENDMODULE
関連記事
- QuotedPrintable関数 (自作関数)
- Quoted-printableのエンコード・デコードを行います。
- Base64関数 (自作関数)
- Base64のエンコード・デコードを行います。
- Cipher関数 (自作関数)
- 文字列の暗号化・復号を行います。
- Morse関数 (自作関数)
- モールス信号の符号化・復号を行います。