Язык Zig (канал)
173 subscribers
27 photos
3 videos
6 files
240 links
Download Telegram
Парный стрим kristoff_it и andrewrk по программированию https://www.twitch.tv/kristoff_it
#стримы
🔥1
https://github.com/ziglang/zig/pull/17497
pub fn fatal(comptime fmt: []const u8, args: anytype) error{TestFatal} {
fail(fmt, args);
return error.TestFatal;
}
оказывается можно писать и так, думал только error{TestFatal}!void (и т.д.) работает
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