Синтаксис
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
.