import "libc.hff"; union Val { u u32, f f32, } enum Color : i16 { Red, Green, Blue } defmacro each(i, x, arr, &body) [ for let i = 0z; i < arr.#len; ++i { let x = arr[i]; body } ] static xs *void = {}; fn isort(xs *int, n usize) void { fn icmp(lhs *const void, rhs *const void, _ *void) int { let lhs = *as(*int)lhs, rhs = *as(*int)rhs; return lhs - rhs; } qsort(xs, n, 4, &icmp); fn foo() void {} let x= &foo; x(); } struct List; struct List { next *List, val int, fn ok(l List) void; fn length(l *List) usize { let n = 0z; ok(*l); for ; l; l = l.next { ++n; } return n; } fn ok(l List) void {} } struct Vec2f; struct Vec2f { x f32, y f32, fn mag(v Vec2f) f32 { extern fn sqrtf(_ f32) f32; return sqrtf((v.x * v.x) + (v.y * v.y)); } fn zero(v *Vec2f) void { v.x = 0; v.y = 0; } } fn spanz(cstr *const u8) [#]const u8 { extern fn strlen(s *const u8) usize; return cstr[0 :: strlen(cstr)]; } defmacro transmute(Type, x) [ (do union T { from typeof(x), to Type }; (T{x}).to; ) ] enum union Number { none, int i64, flo f32, } defmacro match(ty, x, &body) [ (do let $res ty = {}; #'match do { defmacro yield(X) [ $res = (X); break #'match ] switch (x) body } while #f; $res; ) ] extern fn main (argc int, argv **u8) int { let colors [3]Color = { :Red, :Green, :Blue } ; let x = Vec2f { .y: 1, .x: 2.4 }; let p *const Vec2f = &x; printf("v = { %g, %g }\n", x.x, p.y); printf("mag = %g\n", x->mag()); Vec2f:zero(&x); printf("mag = %g\n", (&x)->mag()); let x = Number:none; let x = Number:int{}; printf("match: %d\n", match(int, x) { case none; yield(42); case int i; yield(i - 7); case flo f; yield(f * 0.5f); }); let is []int = { [4] = 1, 2, [1 - 1] = 3 }; isort(is, is.#len); each(i, x, is) { printf("%d\n", x); } let slice [#]int = is[3::5]; static test *const u8 = "hi"; printf("sl %d\n", slice[0]); slice = slice[1::4]; printf("sl %d\n", slice[0]); slice.#len; printf("%c\n", "ABCD"[1::][1::2][1]); let const v Vec2f = {}; // v->zero(); // v.x += 1; printf("sizeof(is) = %zu\n", sizeof(is)); printf("sizeof *void = %zu\n", sizeof *void); printf("alignof f64= %zu\n", alignof f64); printf("1.2 -> %#.8x\n", transmute(u32, 1.2f)); switch is.#len { case 0, 1; is.#len < 2; case 3; 3; case else; "idk"; } switch colors[0] { case :Red; } return 0; }