Руководство по языку
Документация описывает зафиксированный объём экспериментального предварительного выпуска v0.0.18. Фактическая публикация и файлы загрузки указаны в GitHub Releases. Это руководство знакомит с основным синтаксисом. Нормативными остаются контракт синтаксиса и контракт семантики репозитория. Это учебные фрагменты; различия описаны в поддержке бэкендов.
Переменные и типы
Раздел «Переменные и типы»name = "Ku"count:int = 3ready:bool = truevalues:[int] = [1, 2, 3]count += 1Первое присваивание объявляет переменную. Примитивные типы: int, float, bool, str и null. Целые числа — знаковые 64-битные; числа с плавающей точкой используют binary64. Целые числа не преобразуются в условия по неявной истинности.
Функции и управление потоком
Раздел «Функции и управление потоком»Этот полный базовый пример взят из examples/function.ku:
fn add(a: int, b: int): int { return a + b}
fn main() { println(add(10, 20))}Ожидаемый вывод: 30. Этот фрагмент управления потоком можно поместить внутрь main:
total = 0for i in 5 { total += i}if (total == 10) { println("sum ok")}for i in 5 перебирает значения от 0 до 4. if и while требуют условия типа bool. Несколько инструкций заключаются в фигурные скобки. Для выражений ветвления используется match; switch отсутствует.
Владение и заимствование только для чтения
Раздел «Владение и заимствование только для чтения»int, float, bool и null — значения Copy. Строки, массивы, объекты, структуры, перечисления, Results и значения функций — Owned. Присваивание и обычные аргументы по умолчанию перемещают значения с владением. Для независимого значения используйте .clone(). Tasks клонировать нельзя.
original = "Ku"copy = original.clone()println(original)println(copy)Синхронная функция может объявить заимствованный параметр только для чтения:
fn length(&text: str): int { return text.len()}Вызывайте её как length(value), без & у аргумента. Заимствованные данные нельзя изменять, перемещать из них значения или выводить за пределы вызова. Такие сочетания, как заимствованные параметры async, пока не поддерживаются. Заимствование только для чтения не гарантирует произвольной чистоты функции.
Структуры, объекты и модули
Раздел «Структуры, объекты и модули»struct User { name: str age: int}
user = User { name: "Ku", age: 1 }println(user.name)Динамические объекты используют { name: "Ku" }. Обычное обращение к отсутствующему индексу объекта завершается ошибкой. value["name"]? выполняет поиск через Result и при успехе возвращает KuValue. Для конкретного типа используйте .as_str()? или .as_int()?. Отсутствующий ключ не превращается незаметно в null.
Импорты стандартной библиотеки используют пути с точками, например import json from "std.json". Локальные модули могут использовать import math from "./math". Имена пользовательских экспортов верхнего уровня начинаются с заглавной ASCII-буквы; имена со строчной буквы остаются закрытыми внутри файла.
Обрабатываемые ошибки
Раздел «Обрабатываемые ошибки»Тип результата T! возвращает T или Error. ? передаёт обрабатываемую ошибку вызывающему коду; fail создаёт её:
fn read_name(): str! { fail "name missing"}
fn main() { try { println(read_name()?) } catch (error) { println(error.message) }}Error содержит поля domain, code и message. Обычный catch не перехватывает panic, отмену Task или тайм-аут. Очистка при отмене в finally использует общий бюджет абсолютного срока; завершение произвольной пользовательской очистки не гарантируется.
Границы конкурентного выполнения
Раздел «Границы конкурентного выполнения»Код приложения получает одноразовый дескриптор Task вызовом async fn, затем использует await. Прикладных API с именами task.spawn, Task.new или thread.spawn нет. Покрытие интерпретатора и нативного подмножества Task различается. Работа примера в одном бэкенде не доказывает полную поддержку в другом. См. поддержку платформ и бэкендов.