Синтаксис
type Vector3
def with_y self (y : f32) = Vector3 self.x y self.z
Параметр self
предотвращает затенение поля y
одноимённым параметром.
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
Имена полей кортежа не влияют на совместимость типов.
val identity = Matrix3 1
m22 = 1
m33 = 1
f@ struct@zero
Задавать значения полей можно позиционно, по имени и с помощью заполнителя. Работает одинаково для создания объектов, инициализации структур, наследования типов и вызова функций. Сначала идут позиционные аргументы, затем именованные, по одному на строку, и в конце заполнитель. Тип заполнителя должен либо совпадать с типом создаваемой сущности, либо быть кортежем с именованными полями.
let vector = Vector3@ref 1 3 8
Структура инициализируется в куче из-за суффикса @ref
. Привязка vector
имеет тип 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
Видимость элементов ограничивается с помощью атрибутов @local
, @private
, @protected
и @internal
. Влияют только на доступ из других файлов.
Аргумент атрибута @mut
уточняет область изменяемости поля.
begin@ editor
type Editor =
var count : u64 = 0
var should_separate @local = false
let rectangle = Rectangle.new
end@ editor
editor
это логический файл. За пределами editor
привязка count
становится только для чтения, а should_separate
не видна. rectangle
становится недоступной, когда заканчивается либо editor
, либо физический файл.
type Grid @mut =
var count : u32 = 0
var distance : u32 = 0
Поля становятся изменяемыми повсеместно по-умолчанию благодаря атрибуту @mut
на уровне типа.
type Array<T> @byval =
val size : u32
let ptr @param = kedr/alloc<T> size
Атрибут @param
делает привязку необязательным именованным параметром конструктора, может также использоваться в функциях.
let up_right = Vector3 left.as<f32> 0 border_z
let adjusted_size = size as f32 * 1.5 |> as<u32>
Преобразование типа можно записать без скобок.
import num/vector_f32/Vector3
Vector4
vector_i32/Vector2i
control.set_width width
set_height control.measure_height
arrange
Методы set_width
, set_height
и arrange
вызываются на одной и той же привязке control
.
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 = "save"
on_press = { save_current_file }
Button
text = "load"
on_press = { show_load_dialog }
Объект stack
присваивается полю border.content
, кнопки добавляются в список stack.items
. Поля content
и items
обозначены атрибутом @dst
.