Zig 入門 #5 - Functions
2022-04-21 / Zig, Programming
ziglearn.org を参考に Zig
の基本を一通りさらってみます。まずは Chapter 1 - Basics | ziglearn.org から。今回はfunction
について。
Functions
参考: Functions
構文は以下のようになります。 他の言語でもある感じの構文なので違和感はないですね。
fn name(value: type, ...) type {
return return_value;
}
- 関数の識別子は
fn
です- アクセス修飾子があるようですが現時点ではわかりません
- 関数の型が
void
で無い限りreturn
は必要です - 変数名は
snake_case
で関数名はcamelCase
で記述します - 再帰呼び出しも実行可能ですが スタックオーバーフローや型のオーバーフローが発生します
- 結果の呼び出しを無視したい際には
_
を使用します - 関数の引数はイミュータブルです
今回確認したコードは以下の通りです。
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
}