Files
2026-08-24 15:55:23 +02:00

60 lines
1.3 KiB
Plaintext

// structs.vr — struct/record values with field access.
// vr run examples/structs.vr
fn make_point(x, y) {
return { x: x, y: y }
}
fn dist_sq(p) {
return p.x * p.x + p.y * p.y
}
fn main() {
// struct literal: { name: value, ... }
let p = { name: "bob", age: 30 }
println(p) // {name: bob, age: 30}
println(p.name) // bob
println(p.age) // 30
// field assignment mutates the record
p.age = 31
println(p.age) // 31
// structs are reference values, like arrays
let q = p
q.age = 40
println(p.age) // 40 — p and q share the same record
// structs flow through functions
let pt = make_point(3, 4)
println(dist_sq(pt)) // 25
// structs compose with arrays, in both directions
let pts = [{ x: 1, y: 2 }, { x: 10, y: 20 }]
println(pts[1].x) // 10
pts[0].x = 99
println(pts[0].x) // 99
let person = { name: "amy", addr: { city: "nyc", zip: 10001 } }
println(person.addr.city) // nyc
person.addr.zip = 90001
println(person.addr.zip) // 90001
let holder = { items: [1, 2, 3] }
holder.items[1] = 42
println(holder.items) // [1, 42, 3]
// records can be built incrementally from an empty struct
let s = {}
s.kind = "point"
s.value = 7
println(s) // {kind: point, value: 7}
// structs compare by identity with == / !=
let a = { n: 1 }
let b = a
let c = { n: 1 }
assert a == b
assert a != c
}