電卓の機能で整数を使う
このチュートリアルでは、基本的な算術演算を行うためのいくつかのパブリックエントリポイント関数を持つ単一の Actor を作成して、簡単な電卓プログラムを書いていきます。
このチュートリアルでは、Actor は Calc
と名付けます。このプログラムは cell
変数を使用して、電卓操作の現在の結果を表す整数を格納します。
このプログラムは以下の関数呼び出しをサポートしています:
add
関数は入力を受け取り、加算を実行する。sub
関数は入力を受け取り、減算を実行する。mul
関数は入力を受け取り、乗算を実行する。div
関数は入力を受け取り、除算を実行する。clearall
関数は、以前の操作の結果として保存されたcell
値をクリアして、cell
値をゼロにリセットします。
また、div
関数には、プログラムがゼロで割り切ろうとするのを防ぐためのコードも含まれています。
始める前に
チュートリアルを始める前に、以下を確認してください:
ダウンロードとインストールの説明に従って、SDK パッケージをダウンロードし、インストールする。
ローカルコンピューターで動作しているすべての Canister 実行環境を停止する。
このチュートリアルの所要時間は約 20分です。
新しいプロジェクトを作成する
このチュートリアルのための新しいプロジェクトを作成します:
ローカルコンピューターでターミナルシェルを開きます(まだ開いていない場合)。
Internet Computer のブロックチェーン・プロジェクトに使用しているフォルダがある場合は移動します。
以下のコマンドを実行し、新しいプロジェクトを作成します:
dfx new calc
次のコマンドを実行して、プロジェクトディレクトリに移動します:
cd calc
デフォルトの設定を修正する
このチュートリアルでは、デフォルトの dfx.json
設定ファイルを修正して、メインプログラムにもっと具体的な名前を使えるようにしましょう。
デフォルトの設定ファイル dfx.json
を修正します:
設定ファイル
dfx.json
をテキストエディタで開いてください。Main
キーの設定を、デフォルトのmain.mo
プログラム名からcalc_main.mo
に変更します。例:
"main": "src/calc/calc_main.mo",
このチュートリアルでは、ソースファイルの名前を
main.mo
からcalc_main.mo
に変更してどのように設定ファイルdfx.json
の設定がコンパイルするソースファイルを決定するかを簡単に説明しています。より複雑な Dapp では、単一の
main
プログラムファイルではなく、複数のソースファイルを使用することがあります。さらに複雑なアプリケーションでは、複数のソースファイルの間に特定の依存関係があり、それをdfx.json
設定ファイルの設定を使って管理する必要があるかもしれません。このようなシナリオでは、複数の Canister とプログラムがdfx.json
ファイルに定義されているので、複数のファイルをすべてmain.mo
という名前で管理すると、ワークスペースをナビゲートしづらくなります。各プログラムの名前は重要ではありませんが、dfx.json
ファイルで設定した名前がファイルシステム内のプログラムの名前と一致することが重要です。変更を保存して、ファイルを閉じて続行します。
デフォルトのプログラムを修正する
このチュートリアルでは、デフォルトのプログラムを基本的な算術演算を行うプログラムに置き換える必要があります。
デフォルトのプログラムを置き換えるには:
必要であれば、プロジェクトディレクトリに留まっていることを確認します。
以下のコマンドを実行して、テンプレートの
main.mo
ファイルをコピーし、calc_main.mo
という名前のファイルを新規に作成します:cp src/calc/main.mo src/calc/calc_main.mo
テキストエディタで
src/calc/calc_main.mo
ファイルを開き、既存の内容を削除します。このコード をコピーして
calc_main.mo
ファイルに貼り付けてください。このサンプルコードでは、整数(
Int
)のデータ型を使用しているため、正負の数を使用できることにお気づきでしょう。もし、この電卓の関数が正の数しか使えないように制限したい場合は、データ型を変更して、自然数(Nat
)のデータしか使えないようにすればよいでしょう。変更を保存して、ファイルを閉じて続行します。
ローカルキャニスター実行環境の起動する
calc
プロジェクトをビルドする前に、開発環境でローカルに動作している Canister 実行環境に接続するか、アクセス可能なサブネットに接続する必要があります。
ローカルでネットワークを起動するには dfx.json
ファイルが必要なので、プロジェクトのルートディレクトリにいることを確認する必要があります。このチュートリアルでは、ターミナルシェルをふたつ用意し、一方のターミナルでネットワーク操作を開始・確認し、もう一方のターミナルでプロジェクトを管理できるようにします。
ローカル Canister の実行環境を起動するには、次のようにします:
ローカルコンピューターで新しいターミナルウィンドウまたはタブを開きます。
必要であれば、プロジェクトのルートディレクトリに移動します。
これで、2つのターミナルが開いた状態になっているはずです。
プロジェクトディレクトリを、現在の作業ディレクトリとする必要があります。
以下のコマンドを実行して、お使いのマシンのローカル Canister 実行環境を起動します:
dfx start
ローカルネットワークを起動すると、ターミナルにネットワーク操作に関するメッセージが表示されます。
ネットワーク操作を表示しているターミナルは開いたままにして、新しいプロジェクトを作成した元のターミナルをフォーカスしてください。
Dapp の登録、ビルド、デプロイ
ローカルの Canister 実行環境に接続した後、ローカルで Dapp の登録、ビルド、デプロイができます。
ローカルに Dapp をデプロイするには:
必要に応じて、まだプロジェクトのルートディレクトリにいることを確認します。
以下のコマンドを実行して、Dappを登録、ビルド、デプロイしてください:
dfx deploy
dfx deploy
コマンドの出力は、実行した操作に関する情報を表示します。
Canister で電卓の機能を確認する
これで、プログラムがローカルのキャニスター実行環境上に Canister としてデプロイされました。このプログラムは dfx canister call
コマンドを使用してテストすることができます。
デプロイしたプログラムをテストするには、以下のようにします:
dfx canister call
コマンドを使用して、calc
キャニスターadd
関数を呼び出し、次のコマンドを実行して入力引数10
を渡します:dfx canister call calc add '(10)'
シングルクォーテーションと括弧で囲まれた引数を渡すと、インターフェース記述言語(IDL)がその引数の型を解析するので、引数の型を手動で指定する必要はありません。
コマンドが
add
関数に対して期待される値を返すことを確認します。例えば、プログラムは次のような出力を表示します:(10)
以下のコマンドを実行して、
mul
関数を呼び出し、入力引数3
を渡します:dfx canister call calc mul '(3)'
コマンドが
mul
関数に対して期待される値を返すことを確認します。例えば、このプログラムでは次のような出力が表示されます:(30)
以下のコマンドを実行して、
sub
関数を呼び出し、入力引数としてnumber
型の5
を渡します:dfx canister call calc sub '(5)'
コマンドが
sub
関数に対して期待される値を返すことを確認します。例えば、このプログラムでは次のような出力が表示されます:(25)
次のコマンドを実行して、
div
関数を呼び出し、入力引数5
を渡します:dfx canister call calc div '(5)'
コマンドが
div
関数に対して期待される値を返すことを確認します。例えば、プログラムは次のような出力を表示します:(opt 5)
div
関数がオプションの結果を返すことに気がついたかもしれません。このプログラムは、div
関数がゼロ除算エラーの場合にnull
を返せるようにするために、結果をオプションにしています。このプログラムのセル変数は整数なので、その関数を呼び出して負の入力値を指定することも可能です。例えば、次のようなコマンドを実行します:
dfx canister call calc mul '(-4)'
すると、以下のように返されます:
(-20)
clearall
関数を呼び出して、cell
の値を 0 にリセットすることを確認します:dfx canister call calc clearall
すると、このプログラムでは次のような出力が表示されます:
(0)
ローカル Canister の実行環境を停止する
Dapp のテストが終了したら、ローカル Canister 実行環境を停止して、バックグラウンドで実行し続けないようにします。
ローカル Canister の実行環境を停止するには、以下の手順に従います:
操作が表示されているターミナルで、Control-C キーを押して処理を中断します。
以下のコマンドを実行して、ローカル Canister の実行環境を停止します:
dfx stop