(日本語訳) Chain Castle – Lesson 2 Chapter 2

Libra
Libra Move言語
スポンサーリンク

Chapter 2 プログラムの構造

他の言語と似た様に、Moveは選択やループの様な一般的なプログラム構造を持っています。
次のようなルールのif-else構文を使って単純な選択構造を実装できます。

もしステートメントが一つだったとしても、分岐構文はブレース({})で括る必要があります。次の例は間違いです。

main() {
    let x: u64;
    if (true) x = 3; // ここでx=3は{}で括られているべき
    return;
}

各分岐のステートメントに付け加えられるセミコロンについて、ブレースの後ろには必要ありません。次もまた間違いの例です。

main() {
    let x: u64;
    if (true) x = 3;
    else {
        x = 5
    }; // このセミコロンは前の行につけられるべきです。
    return;
}

もしある識別子が全てのケースを含まない分岐ステートメントの中で初期化されるなら、その識別子はその分岐の後ではアクセスできません。次の例は間違いです。

main() {
    let x: u64;
    if (true) {
        x = 42;
    }   // ここで、変数xはifブランチ内で初期化されており、一方elseブランチでは初期化されていません。そのため後でcopy(x)を使うことはできません。 
    assert(copy(x) == 42, 42);
    return;
}

分岐が全てのケースを含んでいる場合、識別子は分岐の後でもアクセスすることができます。以下に例示します。

main() {
    let x: u64;
    if (true) {
        x = 42;
    } else {
        x = 43;
    }   // この二つのブランチがtrue/falseを含んでおり、これは変数xはどうやっても初期化されることを意味しています。そのため後でcopy(x)が使えます。
    assert(copy(x) == 42, 42);
    return;
}

分岐の中でmove()ファンクションを使うとき、所有権の問題について注意が必要です。この関数で実装されている識別子は分岐の後で再びアクセスされるべきではありません。次はダメな例です。

main() {
    let x: u64;
    let y: u64;
    x = 0;
    if (true) {
        y = move(x);
        // この分岐内でxの所有権をyに渡します。そのため、続くコードでcopy(x)によってxに再びアクセスすることはできません。
    }
    assert(copy(x) == 0, 42);
    return;
}

loopを使ってループ構造を作ることもできます。このチャプタではスペースの関係で詳細解説しませんが、後に続くチャプチャーで説明されます。

実習

再帰はPower関数を実装する最も一般的な方法です。次はC言語でのPower関数の実装です。

int pow(int x, int n) {
    if (n == 0) {
        return 1;
    }
    if (n == 1) {
        return x;
    }
    if (n % 2 == 0) {
        return pow(x * x, n / 2);
    } else {
        return pow(x * x, n / 2) * x;
    }
}

上記のプログラムをエミュレートしてpow()関数をMathモジュール内に実装してください。変数の所有権の問題や、copy()move()を適切に使うことに注意してください。

Move Castle
タイトルとURLをコピーしました