電卓の機能で整数を使う
このチュートリアルでは、基本的な算術演算を行うためのいくつかのパブリックエントリポイント関数を持つ単一の 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 deploydfx 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