Язык Zig (канал) – Telegram
Язык Zig (канал)
181 subscribers
28 photos
3 videos
6 files
246 links
Download Telegram
Язык Zig (канал)
Экспериментальная поддержка Zig в re2c (генераторе лексера, юзается в ninja, php, т.д.), это вдобавок к C/C++/Rust. https://github.com/skvadrik/re2c/commit/5cd48a8ffb1bfc82b17bd7f381437efd1678b188 https://github.com/skvadrik/re2c/issues/451#issuecomment-2229461380
Пример:

// re2zig $INPUT -o $OUTPUT

const std = @import("std");

fn lex(yyinput: [:0]const u8) bool {
var yycursor: u32 = 0;
/*!re2c
re2c:define:YYCTYPE = u8;
re2c:yyfill:enable = 0;

number = [1-9][0-9]*;

number { return true; }
* { return false; }
*/
}

test {
try std.testing.expect(lex("1234"));
}

Конвертируется в:
// Generated by re2c
// re2zig $INPUT -o $OUTPUT

const std = @import("std");

fn lex(yyinput: [:0]const u8) bool {
var yycursor: u32 = 0;

var yych: u8 = 0;
var yystate: u32 = 0;
while (true) {
switch (yystate) {
0 => {
yych = yyinput[yycursor];
yycursor += 1;
switch (yych) {
0x31...0x39 => {
yystate = 2;
continue;
},
else => {
yystate = 1;
continue;
},
}
},
1 => { return false; },
2 => {
yych = yyinput[yycursor];
switch (yych) {
0x30...0x39 => {
yycursor += 1;
yystate = 2;
continue;
},
else => {
yystate = 3;
continue;
},
}
},
3 => { return true; },
else => { @panic("internal lexer error"); },
}
}

}

test {
try std.testing.expect(lex("1234"));
}
👍1
Язык Zig (канал)
Пример: // re2zig $INPUT -o $OUTPUT const std = @import("std"); fn lex(yyinput: [:0]const u8) bool { var yycursor: u32 = 0; /*!re2c re2c:define:YYCTYPE = u8; re2c:yyfill:enable = 0; number = [1-9][0-9]*; number…
с labeled switch было бы ещё легче, но тот PR пока не смержили, так шо вот... тут та же стратегия что и в Rust версии используется емнип, в C/C++ как раз goto-шный switch (на который похож наш будущий labeled switch), чет тип такого:
state: switch (yystate) {
    0 => {
        yych = yyinput[yycursor];
        yycursor += 1;
        switch (yych) {
            '1'...'9' => continue :state 2,
            else => continue :state 1
        }
    },
    1 => { return false; },
    2 => {
        yych = yyinput[yycursor];
        switch (yych) {
            '0'...'9' => {
                yycursor += 1;
                continue :state 2;
            },
            else => continue :state 3,
        }
    },
    3 => { return true; },
    else => { @panic("internal lexer error"); },
}
Язык Zig (канал)
https://github.com/ziglang/zig/issues/20663 Планируют удалить usingnamespace. Полная фигня ИМХО, но я хз что туда написать, пока не собрал все мысли. #upstream
У нас и так нет способа создать структуру/перечисления/т.д. с нужными объявлениями в комптайме (если в @Type поле .decls будет не пустое, компилятор ошибку выдаст), а без usingnamespace вообще придется каждую такую генерируемую декларацию дублировать. Плюс у нас нет способа легко создать анонимные функции, так шо будет куча внутренных структур с чисто одной функцией, полная туфта короче.
Язык Zig (канал)
У нас и так нет способа создать структуру/перечисления/т.д. с нужными объявлениями в комптайме (если в @Type поле .decls будет не пустое, компилятор ошибку выдаст), а без usingnamespace вообще придется каждую такую генерируемую декларацию дублировать. Плюс…
Короче, я пока что просто кину ссылку на zalgebra и zig-libgccjit, не представляю как там можно сделать "хотя бы не хуже" без usingnamespace, надеюсь не заигнорят (особенно zalgebra, пушто в zig-libgccjit можно сделать без usingnamespace, но читаемость и качество ошибок компиляции очень пострадает)
Веб-интерфейс для fuzz-тестинга. Помимо прочего показывает рабочее покрытие кода (в красных точках код не достигался, в зелёных — достигался)

https://github.com/ziglang/zig/pull/20958
#upstream
🔥11
Forwarded from Leggy Flomb
🔥2🥴2
Оооо блин, оказывается книгу по Zig уже делают дней 20 минимум. А Эндрю ток щас ретутнул в мастодоне :)
👍61
Язык Zig (канал)
Оооо блин, оказывается книгу по Zig уже делают дней 20 минимум. А Эндрю ток щас ретутнул в мастодоне :)
https://pedropark99.github.io/zig-book/

https://github.com/pedropark99/zig-book

2/5
There is still a lot to be done. But the idea behind it is to be an Open Book that introduces the language by solving small projects, in a similar style to the famous "Python Chrash Course" book from Eric Matthes.

Ещё многое предстоит сделать. Но идея заключается в том, что это будет открытой книгой, которая знакомит с языком, решая небольшие проекты, в стиле знаменитой книги "Изучаем Python" от Эрика Мэтиз.

https://fosstodon.org/@pedropark99/112813567441618116

Бесплатная и открытая, под CC-BY 4.0 лицензией (кратко говоря, просто авторство сохранять и упомянуть https://creativecommons.org/licenses/by/4.0/deed.ru)
👍71
Язык-подмножество Zig, интерпретируемый и с сборщиком мусора...

Тут сверху был Zig++, теперь у нас и Zig-- есть :)

https://github.com/sylvrs/zag

Автор стримит разработку здесь: https://www.twitch.tv/sylvrs
🔥3👍2
`compiler: implement @branchHint by mlugg`

Довольно быстро сделали, пропозал только недавно приняли, вместо @setCold и предлагаемого @expect и т.д.

#upstream
👍4👀1
Язык Zig (канал)
`compiler: implement @branchHint by mlugg` Довольно быстро сделали, пропозал только недавно приняли, вместо @setCold и предлагаемого @expect и т.д. #upstream
test "if branch hints" {
var t: bool = undefined;
t = true;
if (t) {
@branchHint(.likely);
} else {
@branchHint(.cold);
}
}

test "orelse branch hints" {
var x: ?u32 = undefined;
x = 123;
const val = x orelse val: {
@branchHint(.cold);
break :val 456;
};
try expect(val == 123);
}
👍2👀1
Фреймворк для создания компиляторов на основе графов.

Написано, что их IR основан на работе RVSDG, а оптимизации на e-graphs + equality saturation.

https://docs.vezel.dev/graf

https://github.com/vezel-dev/graf

#библиотеки
👀3🔥2🤯2🐳1
Бан на одинаковое имя у поля и объявления:
https://github.com/ziglang/zig/pull/21231

Если кто не знал, правила до этого были примерно такие:
* Если у enum/union есть объявление (константа/функция) и поле (тег) с одинаковым названием, то предпочитается объявление
* У struct (самого типа, а не экземпляра) такой проблемы нет, пушто нельзя поле выбирать из типа.
* Если это вызов функции у экземпляра struct (поле с указателем на функцию или объявление-метод), то предпочитается поле

Чёт тип такого:
const Enum = enum {
a,

const a = 0;
};

const Struct = {
func: *const fn() void,

fn func(_: Struct) void {}
};

comptime {
_ = Enum.a; // выберется "const a = 0;"
// чтобы получить именно тег, можно вот так:
_ = @as(Enum, .a);

_ = Struct.func; // только метод понятное дело, нельзя поля так получать
var instance: Struct = .{ .func = undefined };
_ = instance.func(); // выберется "func: *const fn() void"
// чтобы получить именно метод, можно вот так:
_ = Struct.func(instance);
}
👌4🔥1👀1