Skip to content
Draft

Objects

Draft uses records (also called structs) to define custom data structures.

record User
name: String
age: Int
email: String
fin record.
@user = User {
name: "Alice",
age: 30,
email: "alice@example.com"
}

Use # for member access:

write(@user#name) @// "Alice"
write(@user#age) @// 30

Records are immutable by default. Use mut for mutable instances:

mut @user = User {
name: "Alice",
age: 30,
email: "alice@example.com"
}
@user#age = 31 @// OK: user is mutable

Define actions on records:

record User
name: String
age: Int
email: String
fin record.
impl User
action greet(@self: User) -> String
return "Hello, I'm " + @self#name
fin action.
action is_adult(@self: User) -> Boolean
return @self#age >= 18
fin action.
action birthday(@self: mut User)
@self#age = @self#age + 1
fin action.
fin impl.
@user = User { name: "Alice", age: 30, email: "alice@example.com" }
write(@user#greet()) @// "Hello, I'm Alice"
write(@user#is_adult()) @// true

Create a constructor function:

record User
name: String
age: Int
email: String
fin record.
action new_user(@name: String, @age: Int, @email: String) -> User
return User {
name: @name,
age: @age,
email: @email
}
fin action.
@user = new_user("Alice", 30, "alice@example.com")

Provide default values for fields:

record Config
host: String = "localhost"
port: Int = 8080
debug: Boolean = false
fin record.
@config = Config {} @// Uses all defaults
@custom = Config { host: "0.0.0.0", port: 3000 }

Records can be generic:

record Pair<A, B>
first: A
second: B
fin record.
@pair = Pair<Int, String> { first: 1, second: "one" }

Records can extend other records:

record Shape
x: Float
y: Float
fin record.
record Circle
extends Shape
radius: Float
fin record.
@circle = Circle { x: 0.0, y: 0.0, radius: 5.0 }
{@name, @age} = @user
@// name = "Alice", age = 30

Records implement structural equality:

@a = User { name: "Alice", age: 30, email: "a@b.com" }
@b = User { name: "Alice", age: 30, email: "a@b.com" }
@a == @b @// true
@original = User { name: "Alice", age: 30, email: "a@b.com" }
@copy = @original#clone()

For singleton patterns:

singleton Logger
action log(@message: String)
write("[LOG] " + @message)
fin action.
fin singleton.
@Logger#log("Hello")
type Point = { x: Float, y: Float }

Continue to Enums for enumerated types.