Язык Zig (канал)
174 subscribers
26 photos
3 videos
6 files
239 links
Download Telegram
usingnamespace оказывается ещё и на enum/union работает... (я думал только на struct и opaque) тот же результат — публичные обьявления ре-экспортируются
Язык Zig (канал)
usingnamespace оказывается ещё и на enum/union работает... (я думал только на struct и opaque) тот же результат — публичные обьявления ре-экспортируются
const Location = enum(u32) {
box = 0,
stolovaya = 1,
workshop = 2,
mine = 3,
_,

pub const start_facilites: u32 = 2;
pub const end_facilities: u32 = 3;
}

const Everything = struct {
pub usingnamespace Location; // теперь можно писать Everything.start_facilities, но не Everything.box пушто не публичное обьявление, а просто член
};
очередной compiler meeting в дискорде начался
Forwarded from Königskraut
немного оффтопик, но смотрите что теперь в телеграме есть

const std = @import("std");

pub fn main() !void {
std.debug.print("kek\n", .{});
}
2👍2🤯1
Königskraut
немного оффтопик, но смотрите что теперь в телеграме есть const std = @import("std"); pub fn main() !void { std.debug.print("kek\n", .{}); }
В k версии [1.9.6 (418)] старый вид, в z/a [10.0.15] новый (с кнопкой копировать) но подсветки нет, в десктоп клиенте [4.11.1] есть и кнопка и подсветка
Кстати насчёт той весёлой задачки „Man or boy test” с Rosetta Code, я по фану сегодня таки сделал её (немного схитрил внутри, но шо поделать — Зиг так хочет), вроде работает с правильными результатами вплоть до 20, дальше мне стека не хватило:

https://rosettacode.org/wiki/Man_or_boy_test?oldid=358095#Zig
🤔1
Язык Zig (канал)
Кстати насчёт той весёлой задачки „Man or boy test” с Rosetta Code, я по фану сегодня таки сделал её (немного схитрил внутри, но шо поделать — Зиг так хочет), вроде работает с правильными результатами вплоть до 20, дальше мне стека не хватило: https://ro…
const Record = struct {
yieldFn: *const fn (record: *Record) i32,

k: *i32 = undefined,
x1: *Record = undefined,
x2: *Record = undefined,
x3: *Record = undefined,
x4: *Record = undefined,
x5: *Record = undefined,

inline fn run(record: *Record) i32 {
return record.yieldFn(record);
}

pub fn A(record: *Record) i32 {
return if (record.k.* <= 0)
record.x4.run() + record.x5.run()
else
record.B();
}

fn B(record: *Record) i32 {
record.k.* -= 1;

var k_copy_on_stack: i32 = record.k.*;

var b: Record = .{
.yieldFn = &Record.B,

.k = &k_copy_on_stack,
.x1 = record,
.x2 = record.x1,
.x3 = record.x2,
.x4 = record.x3,
.x5 = record.x4,
};
return b.A();
}
};

const numbers = struct {
fn positiveOne(unused_record: *Record) i32 {
_ = unused_record;
return 1;
}

fn zero(unused_record: *Record) i32 {
_ = unused_record;
return 0;
}

fn negativeOne(unused_record: *Record) i32 {
_ = unused_record;
return -1;
}
};

const std = @import("std");

pub fn main() void {
var i: u31 = 0;
while (i <= 31) : (i += 1) {
var k: i32 = i;
var @"+1_record": Record = .{ .yieldFn = &numbers.positiveOne };
var @"0_record": Record = .{ .yieldFn = &numbers.zero };
var @"-1_record": Record = .{ .yieldFn = &numbers.negativeOne };

var record: Record = .{
.yieldFn = &Record.B,

.k = &k,
.x1 = &@"+1_record",
.x2 = &@"-1_record",
.x3 = &@"-1_record",
.x4 = &@"+1_record",
.x5 = &@"0_record",
};

std.debug.print("[{d:>3}] = {d}\n", .{ i, record.A() });
}
}
https://ziglang.org/learn/build-system/
Будущая документация про Zig Build System (будет перенесена в доки std.Build как я понял)
#upstream
3
Generating a Star Sphere using Zig
https://pollrobots.com/blog/zig/code/2023/11/11/star-sphere-in-zig.html
Генерация карты звезд с помощью разбора звездного каталога.

#блоги
👍3
https://github.com/ziglang/zig/pull/18017
ошибка при использовании переменной, когда можно было использовать константу (ясен фиг не всё детектит, ну и можно обойти (а иногда и нужно, когда нужно запретить считать в комптайме например):
_ = &variable;

mlugg пишет, что 30 строк сама реализация, всё остальное ~3к это фиксы.

#upstream
👍4🔥1
Ещё один пример, как вывод @compileLog не совсем точно соответствует внутреннему представлению чего-то в компиляторе:

const std = @import("std");
pub fn main() void {
const T_SENTIN = [*:null] ?*const u8;
const T_NOT_SENTIN = [* ] ?*const u8;

@compileLog( @typeInfo(T_SENTIN).Pointer.sentinel);
@compileLog(@typeInfo(T_NOT_SENTIN).Pointer.sentinel);

@compileLog( @typeInfo(T_SENTIN).Pointer.sentinel == @typeInfo(T_SENTIN).Pointer.sentinel);
@compileLog( @typeInfo(T_SENTIN).Pointer.sentinel == @typeInfo(T_NOT_SENTIN).Pointer.sentinel);
@compileLog(@typeInfo(T_NOT_SENTIN).Pointer.sentinel == @typeInfo(T_SENTIN).Pointer.sentinel);
@compileLog(@typeInfo(T_NOT_SENTIN).Pointer.sentinel == @typeInfo(T_NOT_SENTIN).Pointer.sentinel);
}

// // Zig 0.10.1 stage1
// | *const anyopaque
// | *const anyopaque
// | true
// | false
// | false
// | true
//
// // Zig 0.10.1 stage2, Zig 0.11.0
// @as(?*const anyopaque, null)
// @as(?*const anyopaque, null)
// @as(bool, false)
// @as(bool, false)
// @as(bool, false)
// @as(bool, true)
//
// // Zig 0.12.0-dev.1642+5f8641401
// @as(?*const anyopaque, null)
// @as(?*const anyopaque, null)
// @as(bool, true)
// @as(bool, false)
// @as(bool, false)
// @as(bool, true)


https://paste.sr.ht/~bratishkaerik/73921b22554e34f3b948ccf413b7f3165966ce6b
Язык Zig (канал)
https://github.com/ok-ryoko/multiring.zig Мультикольца на Zig под лицензией Expat. #библиотеки
Васянский перевод https://github.com/ok-ryoko/multiring.zig/blob/a812375a84d64c7bf9dbec37b6b446e531e3b9d2/docs/DESIGN.md#choice-of-programming-language

# Выбор языка программирования

При работе с узлами в некоторых контекстах тип узла важен, а в других — нет. Таким образом, выбранный нами язык должен облегчить нам достижение полиморфизма, желательно над фиксированным ограниченным набором типов. (Существует только два типа узлов.) Размеченные объединения в Zig нам подходят идеально. Go предоставляет нам интерфейсы, но они слишком мощные — нам не нужно определять произвольное количество типов узлов. Более того, в Go нет встроенного типа для перечислений (они эмулируются с помощью построителя констант iota). Си предоставляет нам только глобальные (прим. пер.: без привязки к пространствам имён) перечисления.

Zig снабжает нас контрактом unreachable, а также синтаксисом захвата для разыменования опциональрых указателей (прим. пер.: судя по всему, это if (optional) |non_optional| { ... } ). Си и Go не предоставляют эквивалентных функций.

Си и Zig требуют от нас вручную управлять динамически выделяемой памятью. Поэтому мы должны иметь возможность гарантировать, что наша реализация не взаимодействует с кучей, написав ноль строк кода управления памятью. Обеспечить ту же гарантию сложнее в языке со сборкой мусора, таком как Go.

Мы ценим удобство сопровождения, поэтому считаем, что выбранный нами язык должен предоставить нам надежный опыт разработки. Go предоставляет выразительный интерфейс командной строки go, соедржащий команды для форматирования, анализа, создания и тестирования кода Go, а также управления модулями Go. Инструменты Зига выразительны, но не завершены: отсутствует (отдельный) инструмент статического анализа, а менеджер пакетов ещё не стабилен. С другой стороны, Си не предоставляет стандартизированных инструментов разработчика вообще, оставляя нам свободу смешивать и подбирать нужные нам компоненты, вплоть до реализации самого языка. Используем ли мы GNU Compiler Collection (GCC), Clang/LLVM или что-то ещё? Требуется довольно много времени для исследования разных выборов, которые мы, возможно, даже не задействуем.

Си уже более 50 лет, и он стабилен, используется повсеместно, а также имеет ряд международных стандартов и конкурирующих наборов инструментов. По состоянию на май 2023 года Си занимает 2-е место в индексе TIOBE. Go не так зрел, как Си (ему более 10 лет), но он стабилен и широко используется, занимая 12-е место в индексе TIOBE. Go занял свою нишу в экосистемах Интернета, контейнеров и утилит командной строки. Напротив, Zig не является ни стабильным, ни широко используемым. Выбор Zig вместо C и Go означает, что разработчику придётся выделить ресурсы для того, чтобы идти в ногу с последней стабильной версией языка и брать на себя риск внесения критических изменений. Это также означает уменьшение доступности проекта.

Исходя из этих соображений, владелец репозитория решил реализовать мультикольцо на языке Zig.
👍8
Язык Zig (канал)
https://github.com/michal-z/zig-gamedev/wiki/Progress-Reports#july-2022
This media is not supported in your browser
VIEW IN TELEGRAM
Змейка на Зиг с использованием семейства библиотек zig-gamedev. Лицензия Expat.

https://github.com/btipling/btzig-snake

#игры
👍41
Шаблон для Zig решебника Advent of Code, для master'а (сейчас 0.12.0-dev.1754+2a3226453). На 2023 уже первая задача есть https://adventofcode.com/2023 .

https://github.com/SpexGuy/Zig-AoC-Template
👍1