Zig 入門 #5 - Functions

2022-04-21  /  ZigProgramming

ziglearn.org を参考に Zig の基本を一通りさらってみます。まずは Chapter 1 - Basics | ziglearn.org から。今回はfunction について。

Functions

参考: Functions

構文は以下のようになります。 他の言語でもある感じの構文なので違和感はないですね。

fn name(value: type, ...) type {
  return return_value;
}

今回確認したコードは以下の通りです。

fn add(x: u32, y: u32) u32 {
    // 引数はイミュータブルなので再代入できない
    // コンパイルエラーになる
    // x = 10;
    // ./src/main.zig:147:9: error: cannot assign to constant
    //     x = 10;
    return x + y;
}

fn fibonacci(n: u16) u16 {
    if (n == 0 or n == 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

fn function() void {
    const a = add(1, 2);
    std.log.info("a: {}", .{a});

    // 戻値を無視するときは明示的に記述する
    _ = add(100, 200);

    // コンパイルエラーになる
    // add(100, 200);
    // ./src/main.zig:158:8: error: expression value is ignored
    //     add(100, 200);

    // 再帰呼び出しはオーバーフローが発生する可能性があるのでunsafe
    const x = fibonacci(24);
    std.log.info("x: {}", .{x});

    // コンパイルエラーではない
    //const y = fibonacci(25);
    //std.log.info("y: {}", .{y});

    // 25 以降は u16 を超えるため panic が発生する
    // thread 1118951 panic: integer overflow
}