既にドキュメントがあった。
フォーマット形式の資料が以下にあった。
調べた時はなかったので仕方がなくソースを見て理解したけど、無駄に終わっちゃった。
はじめに
Zig言語の動作を確認するためにprintを使用し、各データを確認している。
そのprintの表示について、調査したのでここに記述します。
version: 0.12.0
動作環境: MacOs
対象コード: std/fmt.zig
print関数の定義
print関数には以下の二つの定義がある。
- std.debug.printの定義
const std = @import("std");
const print = std.debug.print;
// --> io.getStdErr().writer().print
標準エラー出力を使っている。そして、エラーの戻りがない。
io.getStdErr().writer()
を呼び出す前にthread間の排他制御(mutex)が入っているので、より安全になっているが、他のthread
と競合する場合があり注意が必要となる。
- std.io.getStdOut().writer()からの定義
const std = @import("std");
const stdout = std.io.getStdOut().writer();
const print = stdout.print;
標準出力を使用で、エラー戻りがある。
従って、try print(....)
とエラー処理が必要となる。
通常は*2.*の標準出力stdout
を使用すべきだろうが、1. stderr
を使用しているのが一般的となっている様だ。
オプション設定
const message: [] const u8 = "print";
const data: u8 = 6;
print("{s} -> {d}: {b}\n", .{message, data, data}); // print -> 6: 110;
""の中の{s}
など設定によりデータを表示する方法を変更する。
{}
の内容は
{[argument][specifier]:[fill][alignment][width].[precision]}
となっている。
- argument - データのインデックス番号またはデータのフィールドで使われる引数の名前を指定する。
const message: [] const u8 = "print";
const data: u8 = 0x42;
print("{s} -> {d}: {1b}\n", .{message, data}); // print -> 66: 1000010
{1b}
の1が{message, data}
のindex0,1の1を指し、dataを意味する。
引数の名前についてはまだわからない。
-
specifier - 表記方法を指定する。 例、{b}-バイナリー
{x} - Hex(16進)表示で小文字 例1ffe
{X} - Hex表示で大文字 例1FFE
{s} - string表示 例 Hello world
{e} - 浮動小数点の表示 例 1.234e3
{d} - デシマル(10進)表示 例 1234
{b} - バイナリー(2進)表示 例10001010
{o} - octal(8進)表示 例 2322
{c} - キャラクタ(Ascii) 1文字表示 例 H
{u} - UTF-8表示 ???
{?} -null
を含むデータを表示する
{!} - Error コード表示
{*} - アドレス表示
{any} - 配列、構造体などのフォーマットとして定義された表示 -
fill - widthで指定された文字幅内の空きにセットする文字
-
alignment -
<
:左寄せ、^
:センター、>
:右寄せで文字を詰める方向を指定
print("{b:0>8}", .{6}); // 00000110
{b:0>8}
の0:fill,>:alignment、8:widthとなっている。つまり、文字幅を8桁で右詰、空きに0を満たす事となる
-
width - 表示する文字幅を指定する。
-
precision - 小数点以下の有効数字
print("dat: {e:.3}\n", .{12.3456}); // 1.235e1
使用例
const std = @import("std");
const print = std.debug.print;
test "sample print function" {
const deci: u16 = 0x1234;
const flo: f32 = 12.345;
const stri: []const u8 = "printing";
print("{1s:<10} : d:{0d:5}\n", .{ deci, stri }); // printing : d: 4660
print(" b:0b{0b:0>16} x:0x{0x:0>4}\n", .{deci}); // b:0b0001001000110100 x:0x1234
print(" e:{0e:<8} {0e:<8.3} {0e:<8.1}\n", .{flo});// e:1.2345e1 1.235e1 1.2e1
}
最後に
現状、Zig言語はprint関数然り、どう使うかのドキュメントがない。そのため、ソースを確認したり実験により調査しました。
参考になれば幸いです。