Синтаксис

val identity = Matrix4 1 0 0 0
                       0 1 0 0
                       0 0 1 0
                       0 0 0 1

Позиционный способ инициализации полей хорошо подходит для матриц. Целочисленный литерал применяется также для вещественных типов чисел.

control.set_width width
        set_height control.measure_height
        arrange

import num/vector_f32/Vector3
                      Vector4
           vector_i32/Vector2i

Методы set_width, set_height и arrange вызываются на одной и той же привязке control.

let enabled_extension_names = ["VK_EXT_debug_report"
                               "VK_EXT_debug_utils"
                               "VK_KHR_surface"
                               "VK_KHR_xcb_surface"
                               "VK_KHR_xlib_surface"]

Запятые между элементами не нужны, если каждый находится на отдельной строке или строках.

let thickness = (left = border.left
                 right = border.right
                 up = border.up
                 down = border.down)

let sizes = List<(u32, u32) width height>.new

Имена полей кортежа не влияют на совместимость типов.

let vector = Vector3 1
                     y = 3
                     f@ struct@zero

Задавать значения полей можно позиционно, по имени и с помощью заполнителя. Работает одинаково для создания объектов, инициализации структур, наследования типов и вызова функций. Сначала идут позиционные аргументы, затем именованные, по одному на строку, и в конце заполнитель. Тип заполнителя должен либо совпадать с типом создаваемой сущности, либо быть кортежем с именованными полями.

let vector_ref = Vector3@ref 1 3 8

Структура инициализируется в куче из-за суффикса @ref. Привязка vector_ref имеет тип mut ref Vector3, что также можно записать как MutRef<Vector3>. Ссылки такого рода по сути являются указателями, которые вместо традиционных для указателей операций дают доступ к полям и методам типа.

text
|> lines
|> filter { line -> line.starts_with "layout" }
|> map { remove_comment _ }

Замыкания создаются с помощью фигурных скобок. Каждое использование подчёркивания возвращает следующий параметр.

var array @internal = Array<T> 0
var size : u32 @[mut internal] = 0

Видимость элементов ограничивается с помощью атрибутов @private, @protected и @internal. Влияют только на доступ из других файлов.

Аргумент атрибута @mut уточняет область изменяемости поля.

let up_right = Vector3 left.as<f32> 0 border_z
let adjusted_size = size as f32 * 1.5 |> as<u32>

Преобразование типа можно записать без скобок.

type Vector3
    def with_y self (y : f32) = Vector3 self.x y self.z

self в содержимом метода нужно указывать явно, если он задан первым параметром.

type Entry =
    path : String
    created : DateTime

    | File size : u32
    | Directory entries : Slice<Entry>
                | Local
                | Remote url : String

Entry и Directory это типы-суммы. Структуры File, Local и Remote наследуют поля path и created. Local и Remote также содержат entries.

type CString ptr
    fun get (i : u32) = ptr[i]

Значение единственного элемента кортежа привязывается к ptr.

Особые функции определяются через ключевое слово fun, fun get это индексатор.

type Slice<T> @byval =
    val ptr : Ptr<T>
    val size : u32

type MutSlice<T> @byval @[mut_of Slice] =
    val ptr : MutPtr<T> @impl

    inherit Slice<T>

Поле ptr имеет разные типы для Slice и mut Slice.

type Object =
    var room : Room @late

Привязка room не является параметром конструктора, вернёт ошибку при попытке чтения до присвоения значения.

# Однострочный комментарий

/* Многострочный комментарий */

Закрывающая часть многострочной лексемы не обязательна.

Внедрение зависимостей

type Selector =
    let add_popup : Control -> Unit @auto
    let remove_popup : Control -> Unit @auto

let main () =
    let selector = Selector.new

let add_popup @publish = app.display.add_popup
let remove_popup @publish = app.display.remove_popup    

main

Поля add_popup и remove_popup типа Selector получат значения соответствующих привязок из корня файла благодаря атрибутам @auto и @publish. На соответствие проверяются как имена привязок, так и их типы.

Дерево объектов

let stack = Stack
    align_h = AlignH/Left
    items = margin
            text_block

Сначала создаётся объект Stack, затем AlignH/Left присваивается его полю align_h, затем margin и text_block добавляются в список items.

stack
    align_v = AlignV/Center
    is_horizontal = true

Мы заменили имя типа именем привязки, поэтому новый объект не создаётся. Выражение возвращает stack.

let border = Border.new
let stack = Stack.new

border
    thickness = 5
    stack
        Button
            text = "start"
            on_press = { start_calculation }
        Button
            text = "stop"
            on_press = { stop_calculation }

Объект stack присваивается полю border.content, кнопки добавляются в список stack.items. Поля content и items обозначены атрибутом @dst.