Спустя шесть месяцев работы и 2023 коммитов команда разработчиков Zig выпустила обновление 0.9.0. Теперь Toolchain работает лучше, Self-Hosted Compiler завершён на 44 процента, Support Table расширена, а Standard Library стал более полезным.
Одно из главных изменений языка — возможность выделить для указателя или переменной определённое адресное пространство. Делается это с помощью ключевого слова addrspace.
pub const will_be_placed_in_flash: i32 addrspace(.flash) = 123;
pub fn readFlash(ptr: *addrspace(.flash) i32) i32 {
return ptr.*;
}
Теперь @tagName, @errorName, @typeName и @embedFile являются *[N: 0]const u8, а не []const u8. Это означает, что они могут использоваться везде, где допустим строковый литерал. Другими словами, их можно привести к одному из следующих типов:
[]const u8
[*:0]const u8
[:0]const u8
Добавлены @minimum и @maximum. Они могут принимать целые и дробные числа, а также векторы. В последнем случае сравнение происходит поэлементно.
@minimum(a: T, b: T) T
Удалили ключевые слова true, false, undefined и null. Теперь они являются примитивами, такими как void, u32 и прочие. Их можно использовать, например, в качестве имён для свойств структур:
const Foo = struct {
true: i32,
false: i32,
undefined: i32,
null: i32,
};<
В Zig появился синтаксис, который позволяет производить безопасные арифметические операции. Если результат не помещается в переменную определённого типа, то значение будет приведено к минимуму или максимуму.
const std = @import("std");
const expect = std.testing.expect;
test "example" {
var x: u8 = 200;
var y: u8 = 100;
try expect(x +| y == 255);
try expect(y -| x == 0);
try expect(y *| x == 255);
try expect(y <<| x == 255)
$ zig test saturating_arithmetic.zig
1/1 test "example"... OK
All 1 tests passed.
Теперь компилятор выдаёт ошибки для неиспользуемых локальных переменных или параметров.
test "example" {
var x: i32 = 1234;
}
$ zig test test.zig
docgen_tmp/test.zig:2:9: error: unused local variable
var x: i32 = 1234;
^
А ещё добавили @select. Он выбирает значения поэлементно из векторов a и b по предикату pred. Если pred[i] истинно, то результатом будет a[i], иначе b[i].
@select(comptime T: type, pred: @Vector(len, bool), a: @Vector(len, T), b: @Vector(len, T)) @Vector(len, T)
Разработчики рассказали, что следующее мажорное обновление — 0.10.0 — будет включать стабилизацию языка, первый драфт спецификации, а также завершённый компилятор.
Полный список изменений можно посмотреть на официальном сайте.