ludic/examples/library/udp.ludic
Orkuncakilkaya b0b0b62bce feat(lang): L7 memory is safe unless it says unsafe
The typed buffers are slices: words/floats/fixeds/doubles/pointers(n) make
zeroed, bounds-checked []int/[]float/... and the type names mean them. buffer(n)
is a []byte, with text_of, Fs.read_bytes/write_bytes and view(xs, start, n).
bytes(), indexing a raw pointer or bytes, free, resize, Memory.*, raw file calls,
data_of and C externs are refused outside unsafe { } / unsafe function, and a
project's own files may write unsafe only with --unsafe; the runtime and packages
are the platform. A slice passed to an extern goes as its data.

What the change found: Sync's atomics on a slice header, words(n) uninitialised,
input's fixed axes in ints, truetype's fixed outlines as ints, skin matrices
typed int, gl_shader's source table made from raw bytes. render3d gets safe
entry points (safe_api.ludic). Rendering is byte-identical; a frame costs the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 12:53:27 +03:00

27 lines
939 B
Text

# udp.ludic — Udp.* on the loopback: two sockets, one datagram each way.
program UdpDemo {
entry {
let a = Udp.open(0)
let b = Udp.open(0)
let pa = Udp.port(a)
let pb = Udp.port(b)
let lo = Udp.ip("127.0.0.1")
let out = buffer(16)
out[0] = 104
out[1] = 105
let sent = Udp.send(a, lo, pb, out, 2)
let inb = buffer(64)
var got = 0
var tries = 0
while got == 0 and tries < 200000 { got = Udp.recv(b, inb, 64); tries += 1 }
let from_ok = Udp.from_ip(b) == lo and Udp.from_port(b) == pa
Udp.send(b, Udp.from_ip(b), Udp.from_port(b), inb, got)
var back = 0
tries = 0
while back == 0 and tries < 200000 { back = Udp.recv(a, out, 16); tries += 1 }
let bad = Udp.ip("1.2.3") == 0 and Udp.ip("300.1.1.1") == 0
print(`{sent} {got} {inb[0]} {inb[1]} {from_ok} {back} {Udp.ip_text(lo)} {bad} {Udp.recv(a, out, 16)} {pa > 0}`)
Udp.close(a)
Udp.close(b)
}
}