Chapter 5 プロシージャ
チャプタ2で言及した様に、プロシージャは他のプログラミング言語における関数と同じ様に、モジュール内で定義できます。
プロシージャの定義
プロシージャを宣言するために、そのビジビリティ(アクセス権)、名前、パラメータと戻り値を次のフォーマットで宣言します。
Visibility Procedure name (parameter name): The type of return value
プロシージャがパラメータを持たない時には、パラメータ名は宣言する必要がありません。また、戻り値がない場合には戻り値の型を宣言する必要はありません。
モジュール内のプロセスは二つの種類のビジビリティを持ちます。
- public:パブリックプロシージャは他のモジュールから呼ぶことができます。
- private:プライベートプロシージャは同じモジュールのプロシージャからのみ呼ばれます。モジュール内のリソースは、プライベートであり他のモジュールからはパブリックプロシージャを通してのみアクセスされます。
パラメータも戻り値も無いプロシージャは、次のようなフォーマットで宣言されます。
public Procedure() {
return;
}
パラメータのあるプロシージャの場合は次の様に宣言されます。
public Procedure(a: u64, b: u64) {
// パラメータの型が異なっている場合や、パラメータの数が異なる場合も形は同様です。
return;
}
プロシージャそれ自身も他のプロシージャのパラメータとして使われることがあることに注意してください。
プロシージャが戻り値を持つなら、次の様に宣言されます。
public Procedure(a: u64, b: u64) : u64 {
// 戻り値の型が異なる場合でも形は同様です。
return 1;
}
上記の例においては、パブリックなプロシージャのみ定義しました。もしプライベートプロシージャを宣言したいならpublic
の表記を消すのみです。
プロシージャをコールする
プロシージャはmodule name.procedure name
によって呼ばれます。プロシージャが同じモジュール内の他のプロシージャによって呼ばれる場合はSelf.procedure name
というフォーマットを使います。
次はプロシージャを定義してコールするサンプルです。
modules:
module Contract {
public Procedure() { //定義部分。Procedureという名前のパブリックなプロシージャ
return;
}
}
script:
import Transaction.Contract;
main() {
Contract.Procedure(); //コール部分。Contractはモジュール名
Call the procedure whose module name is Contract
return;
}
実習
前のチャプタで言及した通り、剰余演算子(%)をシリアルナンバー用の8桁の整数を得るために使います。10のn乗で割った余りはn桁の整数となるため、ここでは10の8乗を計算する手続きを採用していきます。
BuildCastle
モジュールの前に、このコースで必要な全ての計算手続きを含むMath
モジュールを作ります。次の様に、新しく作ったモジュール内に乗数計算を行うプロシージャ
pow()
を宣言してください。- パラメータ:u64型の基数xと乗数n
- 戻り値:u64型の乗算結果値
- 計算内容:とりあえず空。コンパイルを成功させるために、戻り値を1に設定しておきましょう。この機能については次のチャプタで実装します。
Mathモジュールをmain()の前にインポートし、
SerialDigits
の後に、シリアルナンバー内の桁数を表す、SerialLimit
と名付けたu64の変数を宣言します。