Dfinity Examples を動かしてみる (その1 calc編)
1. Dfinity Examples とは
Dfinityの gitに examples という motokoのサンプルプログラムがある。これを動かして触ってみることで motokoの基本を身につけさせようということだろう。
ざっと見てみるとシンプルで自分でも理解できそうなので、ローカルネットワークで動かしてみる。
2. 事前準備
examples プログラムのダウンロード
まずは git clone する。
$ git clone https://github.com/dfinity/examples
各プログラムは、examples/motoko 配下にある。
dfx のインストール
dfx が入ってない場合は、以下のコマンドでインストールする。
$ sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"
3. calcを動かす
calc は Main.mo だけのシンプルな計算プログラム。dfx.jsonもとてもシンプル。
$ cat dfx.json
{
"canisters": {
"calc": {
"main": "src/Main.mo"
}
},
"dfx": "0.7.2"
}
dfx の起動とキャニスターのインストール
キャニスターは buildの前に createが必要。その後インストールする。
$ cd examples/motoko/calc
$ dfx start
$ dfx canister create --all
$ dfx build
$ dfx canister install --all
Creating UI canister on the local network.
The UI canister on the "local" network is "ryjl3-tyaaa-aaaaa-aaaba-cai"
Installing code for canister calc, with canister_id rrkah-fqaaa-aaaaa-aaaaq-cai
使い方
5を足してみる。
$ dfx canister call calc add 5
(5)
変数の初期値は0なので、結果は5となる。カッコに囲われている理由は不明。
2を掛けてみる。
$ dfx canister call calc mul 2
(10)
これ以外のコマンドは sub(引き算), div(割り算), clearall(初期化)。まあ単純なプログラムですね。
4.ソースを読む
せっかくなので、ソースも見てみる。ただし、プログラムは得意ではないので難しいことはあまりわからないかも。
src/Main.mo
1-3行目
actor Calc {
var cell : Int = 0;
motokoはアクターモデルベースのプログラム言語なので、最初に actorというのが出てくる。アクターモデルというのは並列処理が得意なモデルのようだ。
その次は、cell というInt型の変数を宣言して、0を代入する、といったところだろう。
5-9行目
// Add.
public func add(n : Int) : async Int {
cell += n;
return cell;
};
足し算を行うadd関数。Int型のnを引数として受け取る。そしてcellにnを足して、返す。
11-15行目
// Subtract.
public func sub(n : Int) : async Int {
cell -= n;
return cell;
};
引き算を行うsub関数。Int型のnを引数として受け取る。そしてcellからnを引いて、返す。
17-21行目
// Multiply.
public func mul(n : Int) : async Int {
cell *= n;
return cell;
};
掛け算を行うmul関数。
23-32行目
// Divide.
public func div(n : Int) : async ?Int {
if (n == 0) {
// 'null' encodes the division by zero error.
return null;
} else {
cell /= n;
return ?cell;
};
};
割り算のdiv関数。他の関数と異なり、Intの前に?がついているのが気になる。
そして、nが0であればnullを返している。cellの前にも?がついているが、なんだろう。
34-38行目
// Clear the calculator and reset its cell to zero.
public func clearall() : async () {
cell := 0;
};
};
cellを初期化するclearall関数。async () というのが他と異なるが、何も返さないからだろうか。
とりあえずなんとなく理解したので、良しとする。
Discussion