reflection foundation, tuples, debug.print
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
io :: import "@std/io"
|
||||
process :: import "@std/process"
|
||||
|
||||
hide read_ok func(_ ?*mut anyopaque, _ io.ReadStream, buffer []mut u8) usize ! io.ReadError {
|
||||
if buffer.len == 0 {
|
||||
@@ -83,7 +84,7 @@ rejects_bad_read func() bool {
|
||||
}
|
||||
|
||||
rejects_no_progress func() bool {
|
||||
io.write_all(writer_for(&write_none_vtable), "x") catch |err| {
|
||||
io.print(writer_for(&write_none_vtable), "{s}", {"x",}) catch |err| {
|
||||
return err == .no_progress
|
||||
}
|
||||
return false
|
||||
@@ -96,7 +97,8 @@ rejects_bad_write func() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
main func(system std.Io) i32 {
|
||||
main func(init process.Init) i32 {
|
||||
system io.Io :: init.io
|
||||
buffer [2]mut u8 = [0, 0]
|
||||
count usize :: io.read(reader_for(&ok_vtable), buffer[..]) catch 0
|
||||
if count != 2 or buffer[0] != 'o' or buffer[1] != 'k' {
|
||||
@@ -108,17 +110,38 @@ main func(system std.Io) i32 {
|
||||
if eof != 0 or empty_read != 0 or empty_write != 0 {
|
||||
return 5
|
||||
}
|
||||
io.write_all(writer_for(&ok_vtable), "partial") catch |_| {
|
||||
io.print(writer_for(&ok_vtable), "{s}{d}", {"partial", 37}) catch |_| {
|
||||
return 2
|
||||
}
|
||||
if !rejects_bad_read() or !rejects_no_progress() or !rejects_bad_write() {
|
||||
return 3
|
||||
}
|
||||
io.write_all(io.Writer {
|
||||
io.print(io.Writer {
|
||||
impl = system,
|
||||
stream = .stdout,
|
||||
}, "io-ok\n") catch |_| {
|
||||
}, "io-ok {d} {{bro}}\n", {37,}) catch |_| {
|
||||
return 4
|
||||
}
|
||||
io.print(io.Writer {
|
||||
impl = system,
|
||||
stream = .stdout,
|
||||
}, "bounds={d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d} {d}/{d}\n", {
|
||||
minval!(i8), maxval!(u8),
|
||||
minval!(i16), maxval!(u16),
|
||||
minval!(i32), maxval!(u32),
|
||||
minval!(i64), maxval!(u64),
|
||||
minval!(isize), maxval!(usize),
|
||||
minval!(c_char), maxval!(c_char),
|
||||
minval!(c_schar), maxval!(c_uchar),
|
||||
minval!(c_short), maxval!(c_ushort),
|
||||
minval!(c_int), maxval!(c_uint),
|
||||
minval!(c_long), maxval!(c_ulong),
|
||||
minval!(c_longlong), maxval!(c_ulonglong),
|
||||
0, 0,
|
||||
1, 1,
|
||||
-1, 1,
|
||||
}) catch |_| {
|
||||
return 6
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
debug :: import "@std/debug"
|
||||
meta :: import "@std/meta"
|
||||
|
||||
Numbers :: struct { i8, i16, i32 }
|
||||
Row :: struct { value i32 }
|
||||
|
||||
format func() []u8 {
|
||||
return "tuple={d}/{s}, limits={d}/{d}"
|
||||
}
|
||||
|
||||
sum func($T type, value T) i32 {
|
||||
total i32 = 0
|
||||
match typeinfo!(T) {
|
||||
.record |record|: inline for record.fields |field| {
|
||||
total += i32(field!(value, field.name))
|
||||
}
|
||||
else: compile_error!("sum requires a record")
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
static_control func($T type, value T) i32 {
|
||||
total i32 = 0
|
||||
match typeinfo!(T) {
|
||||
.record |record|: inline for record.fields |field| {
|
||||
{
|
||||
if field.index == 1 {
|
||||
continue
|
||||
}
|
||||
total += i32(field!(value, field.name))
|
||||
match typeinfo!(field.type) {
|
||||
.integer: {
|
||||
if field.index == 2 {
|
||||
break
|
||||
}
|
||||
}
|
||||
else: _ = 0
|
||||
}
|
||||
}
|
||||
total += 100
|
||||
}
|
||||
else: compile_error!("static_control requires a record")
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
row_value func(row Row) i32 {
|
||||
return row.value
|
||||
}
|
||||
|
||||
static_aggregates func() i32 {
|
||||
total i32 = 0
|
||||
inline for {Row {value = 2}, Row {value = 40}} |row| {
|
||||
total += row_value(row)
|
||||
}
|
||||
return total
|
||||
}
|
||||
|
||||
main func() i32 {
|
||||
numbers Numbers = Numbers {1, 2, 39}
|
||||
singleton :: {42,}
|
||||
empty :: {}
|
||||
block_value :: {
|
||||
yield 42
|
||||
}
|
||||
_ = empty
|
||||
if singleton.0 != block_value {
|
||||
return 2
|
||||
}
|
||||
if sum(Numbers, numbers) != 42 {
|
||||
return 1
|
||||
}
|
||||
if static_control(Numbers, numbers) != 140 {
|
||||
return 3
|
||||
}
|
||||
if static_aggregates() != 42 {
|
||||
return 4
|
||||
}
|
||||
field!(&numbers, "2") += 1
|
||||
debug.print(format(), {
|
||||
numbers.2,
|
||||
"bro",
|
||||
minval!(i64),
|
||||
maxval!(u64),
|
||||
})
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user