Zig
https://gyazo.com/93c86e446a03b5223a9e561fb642248d
rustよりsyntaxがゴチャついてなくて良いねmrsekut.icon
rust実装のツールをzigに書き直してみたが、エコシステムが追いついてなくてまだきついなという気持ちになったmrsekut.icon
周辺ライブラリを自作し、メンテする必要があり、それをやるほどでもないよなあとなる
std
Cとの親和性が強い
CコードをZigコンパイラでコンパイルできる
ZigコードをC向けにエクスポートできる
Cと同様に、構造体と関数をベースにプログラムを書く
if式
code:zig(js)
const v = if (cond) a else b;
while
code:zig(js)
var sum: u32 = 0;
var i: u32 = 1;
while (i <= 10) : (i += 1) {
sum += i;
}
(i += 1)の部分はcontinue expression
ループ本体が終わるたびに実行される
Cのfor (i=0; i<10; i++)の第3部分みたいなイメージ
配列リテラル
code:zig(js)
const a = 5i32{ 10, 20, 30, 40, 50 }; // 明示的に長さ5 const b = _i32{ 10, 20, 30, 40, 50 }; // コンパイラが5と推論 Emum
code:zig(js)
const Direction = enum {
north,
south,
east,
west,
fn isVertical(self: Direction) bool {
return self == .north or self == .south;
}
};
型を推論できるとき、型名を省略してドットだけで書ける
code:zig(js)
// フルで書くと
const dir = Direction.east;
// 型がわかる文脈では省略可能
switch (dir) {
Direction.north => ..., // フル
.north => ..., // 省略(同じ意味)
}
@ で始まるのはビルトイン関数
標準ライブラリではなく言語に組み込まれた関数
e.g. @import、@divTrunc
code:zig(js)
fn fibonacci(comptime n: u32) u32 {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// コンパイル時に計算される
const fib10 = fibonacci(10);
算術演算子
https://youtu.be/yuSVbuiaBuU?t=8150
Zigはうっかりコーディングミスを絶対に許さない!
すごいmrsekut.icon
型自体をcomptimeな引数として渡して型ごとにdispatchしたりできて、しかもコンパイル時にディスパッチが済んでいるので実行時の性能劣化がなかったり、型を受け取って型を返すコンパイル時関数でパラメトリックな型を実現できたり、といった機能が豊富です。こういう機能のある言語ってあんまりないので興味深いかなと思います(C++のテンプレートメタプログラミングやconstexpr的なことがもっと素直なコードで書けるとも言えるかも)。