mirror of
https://github.com/bearlanguageorg/bear.git
synced 2026-08-26 14:57:18 +00:00
more
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
// 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
|
||||
}
|
||||
@@ -185,6 +185,47 @@ fn test_match() {
|
||||
assert hit == 0
|
||||
}
|
||||
|
||||
fn test_structs() {
|
||||
let p = { name: "bob", age: 30 }
|
||||
assert p.name == "bob"
|
||||
assert p.age == 30
|
||||
p.age = 31
|
||||
assert p.age == 31
|
||||
|
||||
// structs are reference values
|
||||
let q = p
|
||||
q.age = 40
|
||||
assert p.age == 40
|
||||
|
||||
// nested structs
|
||||
let person = { name: "amy", addr: { city: "nyc", zip: 10001 } }
|
||||
assert person.addr.city == "nyc"
|
||||
person.addr.zip = 90001
|
||||
assert person.addr.zip == 90001
|
||||
|
||||
// structs in arrays
|
||||
let pts = [{ x: 1, y: 2 }, { x: 10, y: 20 }]
|
||||
assert pts[1].x == 10
|
||||
pts[0].x = 99
|
||||
assert pts[0].x == 99
|
||||
|
||||
// arrays in structs
|
||||
let holder = { items: [1, 2, 3] }
|
||||
holder.items[1] = 42
|
||||
assert holder.items[1] == 42
|
||||
|
||||
// structs passed to and returned from functions
|
||||
let pt = { x: 3, y: 4 }
|
||||
assert pt.x * pt.x + pt.y * pt.y == 25
|
||||
|
||||
// identity comparison
|
||||
let a = { n: 1 }
|
||||
let b = a
|
||||
let c = { n: 1 }
|
||||
assert a == b
|
||||
assert a != c
|
||||
}
|
||||
|
||||
fn test_failing() {
|
||||
// this one is meant to fail — shows up in `vr test` output
|
||||
assert 1 == 2
|
||||
|
||||
Reference in New Issue
Block a user