ざっくりZig - "Hello, Zig!"の表示に必要なこと
"Hello, Zig!"の表示
$ cat hello.zig # Windowsでは以下5行をテキストエディタで保存
pub fn main() !void {
const std = @import("std");
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, Zig!", .{});
}
$ zig run hello.zig # Windowsも同じコマンド
Hello, Zig!
main関数
最初に必ず実行される関数です。そのため、プログラムには必ず定義されていなくてはなりません。関数とは、何らかの単位で処理をひとまとめにしたものをいいます。関数に入力するデータを引数(ひきすう)といい、処理の結果を戻り値(もどりち)あるいは返り値(かえりち)といいます。
Zigのmain関数では、引数はなく、戻り値はvoid(戻り値なし)もしくはu8(符号なし8ビット整数)です。!は関数内で何らかのエラーが発生し、関数の処理が途中で停止する可能性があることを表しています。
// main関数が値を返さない場合
pub fn main() !void {
// ... 関数内の処理 ...
}
// main関数が値を返す場合
pub fn main() !u8 {
{
// 異常
return 1; // 0,1以外のu8型の場合もある
}
// 正常
return 0;
}
標準ライブラリの使用
const std = @import("std");
プログラム内で様々な処理を行うための関数が予め定義されている標準ライブラリを使用することを宣言します。これ以降、標準ライブラリで定義されている関数をstd.xxx.yyy.zzzのような形式で記述し、呼び出すことができます。関数の詳細はドキュメントを参照してください。
文字列の出力先を取得
const stdout = std.io.getStdOut().writer();
"Hello, Zig!"という文字列の出力先を取得します。出力先は標準出力とします。そのためstd.io.getStdOut()という関数で標準出力を取得し、.writer()で出力の方法を設定します。
文字列を出力
try stdout.print("Hello, Zig!", .{});
"Hello, Zig!"という文字列を前述の出力先に出力します。tryはこの処理でエラーが起った場合は関数の処理を停止し、エラーが起きたことを関数の呼び出し元(main関数の場合、端末で実行されたコマンド)に知らせることを表します。
printは最初の引数で示された書式で出力することを表しまが、ここで出力するのは"Hello, Zig!"という文字列だけで、それ以外の書式は記述されていません。
.{}は書式に埋め込まれるデータを表しますが、ここで表示するのは1つの文字列だけですので、データは記述されていません。
プログラムの実行
$ zig run hello.zig
Zigがインストール(前回参照)されていると、zigコマンドを実行できます。zig run はhello.zigの内容を読み込んで実行するコマンドです。コンパイルしてバイナリを生成するコマンドは別で用意されていますが、ここでは扱いません。
まとめ - "Hello, Zig!"の表示
$ cat hello.zig # Windowsでは以下10行をテキストエディタで保存
// main関数は最初に実行される
// 引数なし !voidは戻り値はないがエラーで処理が停止する可能性があることを表す
pub fn main() !void {
// 標準ライブラリを使用し、関数名はstd.xxx.yyy.zzzのように記述する
const std = @import("std");
// 標準出力と出力先を取得
const stdout = std.io.getStdOut().writer();
// 標準出力に文字列を出力
try stdout.print("Hello, Zig!", .{});
}
$ zig run hello.zig # ソースコードを読み込んで実行
Hello, Zig!
Discussion