Знакомство с Топазом

Познакомьтесь с Топазом - языком, где код становится поэзией. Современный, выразительный язык программирования с идеальной поддержкой символов любых языков и естественной многоязычной разработкой.

Примечание: эта документация соответствует Топазу v4 (текущая версия по умолчанию).

"Язык, где код становится поэзией" - Добро пожаловать в Топаз! 🌟 v4

Топаз - это современный язык программирования, где русский язык является гражданином первого класса. Он стремится к максимальной выразительности при минимальном количестве кода, разработанный так, чтобы разработчики могли писать код именно так, как они думают.

Доступ
Документация открыта для чтения. Часть установочных потоков и инструментов доступна инженерам Studio Haze через внутренние каналы.

Интеграция с ЛИНА код
Топаз входит в перечень из более 30 входных/выходных языков платформы ЛИНА код и используется при разработке семантического ядра CSKernel™, обеспечивающего эти преобразования.

🎯 Что делает Топаз особенным

Идеальная поддержка русского языка

function приветствие(имя: string, язык: string = "русский") -> string {
    match язык {
        case "русский" => "Привет, {имя}! 👋"
        case "английский" => "Hello, {имя}! 👋"
        case "한국어" => "안녕하세요, {имя}님! 👋"
        case "español" => "¡Hola, {имя}! 👋"
        case "français" => "Salut, {имя}! 👋"
    }
}

let пользователь = "Алексей"
let привет = приветствие(пользователь)
print(привет)  // "Привет, Алексей! 👋"

Поэтические конвейеры

let результатАнализа = исходныеДанные
    |> нормализовать(стандарт: "UTF-8")
    |> фильтровать(условие: x => x.действителен())
    |> группировать(критерий: x => x.категория)
    |> агрегировать(метод: среднее)
    |> визуализировать(график: "столбчатый")

Умная система типов

// Мощный вывод типов - безопасность без явного указания типов!
let возраст = 25                // выводится как int
let имя = "Топаз"               // выводится как string
let сложнаяСтруктура = {        // структура полностью выведена
    id: 1,
    теги: ["веб", "api"]
}

// Литеральные типы для дополнительной безопасности
type СветофорЦвет = "красный" | "жёлтый" | "зелёный"
type HTTPСтатус = 200 | 404 | 500

function обработатьСигнал(цвет: СветофорЦвет) {
    match цвет {
        case "красный" => стоп()
        case "жёлтый" => осторожно()
        case "зелёный" => ехать()
        // Компилятор проверяет, что все случаи покрыты!
    }
}

🚀 Основная философия

"Писать меньше, выражать больше"

Стремиться к максимальной выразительности при минимальном количестве кода. Даже сложную логику можно написать читаемо и понятно.

Глобальный синтаксис, локальное выражение

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

Всё является выражением

Все конструкции типа if, match, for, try возвращают значения, что позволяет писать код в более функциональном стиле.

🧩 Профиль нативных систем

  • Нативное исполнение с предсказуемой производительностью и нулевой стоимостью абстракций
  • Владение/заимствование и детерминированное управление ресурсами (defer)
  • Примитивы конкурентности (задачи, каналы) и чёткая модель эффектов
  • FFI с Rust/C; внутренний тулчейн управляет линковкой

Конкуррентность одним взглядом

let профиль = concurrent(timeout: 5s) {
    данные: API.получитьПрофиль(userId)?
    активность: API.получитьАктивность(userId)?
    рекомендации: Рекомендации.построить(userId)
} else {
    {
        данные: кеш.профиль(userId),
        активность: [],
        рекомендации: []
    }
}

match профиль {
    case Ok(info) => log.info("Подготовлено рекомендаций: {info.рекомендации.length}")
    case Err(причина) => log.warn("Выдан кешированный профиль: {причина}")
}

Концептуальный анонс
Низкоуровневый FFI и сокеты появятся на следующих этапах и будут задокументированы после стабилизации.

🌈 Примеры реального кода

Простой веб-API-сервер

вебСервер.создать(порт: 8080)
    .мидлвар(авторизация.JWTПроверка)
    .мидлвар(логирование.отслеживаниеЗапросов)
    .маршрут("/api/пользователи", метод: GET) { запрос, ответ =>
        let списокПользователей = БД.пользователи.найтиВсех()
        ответ.JSON(списокПользователей)
    }
    .маршрут("/api/пользователи/{id}", метод: GET) { запрос, ответ =>
        match БД.пользователи.найтиПоИД(запрос.параметры.id) {
            case Some(пользователь) => ответ.JSON(пользователь)
            case None => ответ.ошибка(404, "Пользователь не найден")
        }
    }
    .запустить()

Конвейер обработки данных

let анализПродаж = файл.прочитать("продажи_2024.csv")
    |> CSV.парсить(естьЗаголовок: true)
    |> фильтр(строка => строка.выручка > 1000000)
    |> группировать(строка => строка.регион)
    |> обработатьГруппы(группа => {
        регион: группа.ключ,
        общаяВыручка: группа.значения.сумма(строка => строка.выручка),
        средняяВыручка: группа.значения.среднее(строка => строка.выручка)
    })
    |> сортировать(поУбыванию: строка => строка.общаяВыручка)

🎁 Революционные возможности

Автоматическая асинхронная обработка

// Весь ввод-вывод автоматически асинхронный, но пишется как синхронный!
function получитьИнфоПользователя(id: int) -> Пользователь {
    let пользователь = API.получитьПользователя(id)         // авто async
    let профиль = API.получитьПрофиль(пользователь.профильИД)  // авто async
    let активность = API.получитьАктивность(id)             // авто async
    
    return Пользователь {
        основнаяИнфо: пользователь,
        профиль: профиль,
        активность: активность
    }
}

Элегантная обработка ошибок

// Просто с типом Result и оператором ?
function безопаснаяОбработкаФайла(путь: string) -> Result<Данные, Ошибка> {
    let файл = открытьФайл(путь)?           // немедленный возврат при ошибке
    defer { файл.закрыть() }                // гарантированное выполнение
    
    let содержимое = файл.прочитать()?
    let данные = JSON.парсить(содержимое)?
    let проверенные = данные.проверить()?
    
    Ok(проверенные)
}

Искусство сопоставления с образцом

let процентСкидки = match клиент {
    case { уровень: "VIP", суммаПокупки } if суммаПокупки > 1000000 => 0.3
    case { уровень: "VIP" } => 0.2
    case { датаРегистрации } if сегодня - датаРегистрации > 365.дней => 0.1
    case { перваяПокупка: true } => 0.15
    case _ => 0.0
}

🎯 Кто использует Топаз?

  • Веб-разработчики: Чистые API-серверы и богатые веб-библиотеки
  • Аналитики данных: Мощные конвейеры и инструменты визуализации
  • Системные разработчики: Производительность и безопасность уровня Rust
  • Начинающие: Более простая кривая обучения, чем у Python
  • Русскоязычные команды: Идеальная поддержка русского языка

🚀 Начать работу!

Топаз разработан так, чтобы изучить за 1 день, использовать в продакшене за 1 неделю.

Начните своё путешествие, где программирование становится поэзией с Топазом!