Control

type Control @abstract =
    var obs width : u32 = 0
    var obs height : u32 = 0

    def measure (w : u32) (h : u32)

obs поля являются наблюдаемыми, могут оповещать об изменениях своего значения.

type Aligner =
    inherit Control

    def Control.measure (w : u32) (h : u32) =
        ...

Aligner определяет абстрактный метод типа Control. Переопределить метод в подтипах больше нельзя.

type ListItem =
    inherit Control

    var obs text = ""
    var obs foreground = Vector3@zero
    var obs background = Vector3@zero
    var obs is_selected = false

    let rectangle = Rectangle
        color@obs = background@obs
        is_visible@obs = is_selected@obs

    let text_block = TextBlock
        text@obs = text@obs
        color@obs = foreground@obs
        align_h = AlignH/Center

    let aligner = Aligner
        items = rectangle
                text_block

Модификатор @zero возвращает обнулённую область памяти.

Конструкторы типов Rectangle, TextBlock и Aligner не принимают аргументов, указанные для полей операции выполняются уже после создания объектов.

rectangle.color обновляется при каждом изменении значения background из-за модификатора @obs.

let aligner = Aligner rectangle text_block

Поле Aligner.items помечено атрибутом @dst.

let rectangle = Rectangle.new
let text_block = TextBlock.new

let aligner = Aligner
    rectangle
        color@obs = background@obs
        is_visible@obs = is_selected@obs
    text_block
        text@obs = text@obs
        color@obs = foreground@obs
        align_h = AlignH/Center

Мы переместили задание полей объектов в выражение для aligner.

let aligner = Aligner
    Rectangle
        color@obs = background@obs
        is_visible@obs = is_selected@obs
    TextBlock
        text@obs = text@obs
        color@obs = foreground@obs
        align_h = AlignH/Center

Если ссылки на Rectangle и TextBlock не нужны, то можно создать объекты на месте.