Основные функции

Изучите все встроенные основные функции Топаза. Полное руководство по манипулированию строками, числами, массивами, объектами и утилитарным функциям.

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

📝 Строковые функции

Базовые операции со строками

// Длина строки и базовая информация
let текст = "Привет Топаз!"
let длина = текст.length()                    // 13
let байтДлина = текст.byteLength()            // Длина в UTF-8 байтах
let пустая = текст.isEmpty()                  // false

// Преобразование регистра
let нижнийРегистр = текст.toLowerCase()       // "привет topaz!"
let верхнийРегистр = текст.toUpperCase()      // "ПРИВЕТ TOPAZ!"
let заглавные = текст.toTitleCase()           // "Привет Топаз!"

print("Оригинал: {текст}")
print("Длина: {длина}")
print("Нижний регистр: {нижнийРегистр}")

Поиск и проверка строк

let содержимое = "Топаз - это современный язык программирования"

// Поиск в строке
let содержит = содержимое.contains("современный")     // true
let начинается = содержимое.startsWith("Топаз")       // true
let заканчивается = содержимое.endsWith("программирования") // true

// Поиск позиции
let индекс = содержимое.indexOf("язык")               // Some(21)
let последнийИндекс = содержимое.lastIndexOf("а")     // Some(41)

// Сопоставление с регулярными выражениями
let совпадениеШаблона = содержимое.match(r"\w+")      // Первое слово
let всеСовпадения = содержимое.matchAll(r"\w+")       // Все слова

print("Содержит: {содержит}")
print("Индекс: {индекс}")

Преобразование и разделение строк

let исходнаяСтрока = "  Привет, Мир, Топаз  "

// Удаление пробелов
let обрезанная = исходнаяСтрока.trim()        // "Привет, Мир, Топаз"
let обрезатьНачало = исходнаяСтрока.trimStart() // "Привет, Мир, Топаз  "
let обрезатьКонец = исходнаяСтрока.trimEnd()  // "  Привет, Мир, Топаз"

// Разделение и объединение строк
let результатРазделения = "яблоко,банан,вишня".split(",")    // ["яблоко", "банан", "вишня"]
let результатОбъединения = результатРазделения.join(" | ")   // "яблоко | банан | вишня"

// Замена строк
let заменённая = "Привет Мир".replace("Мир", "Топаз")        // "Привет Топаз"
let заменитьВсе = "тест тест тест".replaceAll("тест", "код") // "код код код"

print("Обрезанная: '{обрезанная}'")
print("Результат разделения: {результатРазделения}")
print("Заменённая: {заменённая}")

Форматирование строк

// Строковые шаблоны
let имя = "Разработчик"
let возраст = 25
let отформатированная = "Привет, я {имя} и мне {возраст} лет."
print(отформатированная)

// Продвинутое форматирование
let число = 3.14159
let фиксированноеЧисло = число.toFixed(2)      // "3.14"
let экспоненциальное = число.toExponential(2)  // "3.14e+0"

// Добавление символов к строке
let строкаДляЗаполнения = "42"
let левоеЗаполнение = строкаДляЗаполнения.padStart(5, "0")    // "00042"
let правоеЗаполнение = строкаДляЗаполнения.padEnd(5, "0")     // "42000"

print("Фиксированное число: {фиксированноеЧисло}")
print("Левое заполнение: {левоеЗаполнение}")

🔢 Числовые функции

Базовые математические функции

// Основные математические операции
let абсолютное = Math.abs(-42)                // 42
let максимум = Math.max(10, 20, 30)           // 30
let минимум = Math.min(10, 20, 30)            // 10
let квадратныйКорень = Math.sqrt(16)          // 4.0

// Функции округления
let десятичное = 3.7
let потолок = Math.ceil(десятичное)           // 4
let пол = Math.floor(десятичное)              // 3
let округлённое = Math.round(десятичное)      // 4
let усечённое = Math.trunc(десятичное)        // 3

print("Абсолютное: {абсолютное}")
print("Квадратный корень: {квадратныйКорень}")
print("Округлённое: {округлённое}")

Продвинутые математические функции

// Экспоненциальные и логарифмические функции
let натуральнаяЭкспонента = Math.exp(1)       // e^1 ≈ 2.718
let степень = Math.pow(2, 3)                  // 2^3 = 8
let натуральныйЛогарифм = Math.log(Math.E)    // 1
let десятичныйЛогарифм = Math.log10(100)      // 2
let двоичныйЛогарифм = Math.log2(8)           // 3

// Тригонометрические функции
let радианы = Math.PI / 4                     // 45 градусов
let синус = Math.sin(радианы)                 // √2/2 ≈ 0.707
let косинус = Math.cos(радианы)               // √2/2 ≈ 0.707
let тангенс = Math.tan(радианы)               // 1

// Обратные тригонометрические функции
let арксинус = Math.asin(0.5)                 // π/6
let арккосинус = Math.acos(0.5)               // π/3
let арктангенс = Math.atan(1)                 // π/4

print("Натуральная экспонента: {натуральнаяЭкспонента}")
print("Синус: {синус}")
print("Арксинус: {арксинус}")

Утилитарные функции для чисел

// Проверка чисел
let число1 = 42
let число2 = 3.14
let бесконечность = 1.0 / 0.0
let неЧисло = 0.0 / 0.0

let целоеЧисло = Number.isInteger(число1)      // true
let конечное = Number.isFinite(число2)         // true
let бесконечное = Number.isInfinite(бесконечность) // true
let НеЧисло = Number.isNaN(неЧисло)            // true

// Преобразование чисел
let парсингЦелого = Number.parseInt("42")      // Ok(42)
let парсингВещественного = Number.parseFloat("3.14") // Ok(3.14)
let парсингОснования = Number.parseInt("1010", 2)    // Ok(10) - двоичная

print("Целое число: {целоеЧисло}")
print("Парсинг основания: {парсингОснования}")

Функции диапазона и ограничений

// Ограничение диапазона значений
function clamp(значение: float, мин: float, макс: float) -> float {
    return Math.max(мин, Math.min(значение, макс))
}

let ограниченноеЗначение = clamp(15, 10, 20)   // 15
let ограниченноеЗначение2 = clamp(5, 10, 20)   // 10
let ограниченноеЗначение3 = clamp(25, 10, 20)  // 20

// Линейная интерполяция
function lerp(начало: float, конец: float, отношение: float) -> float {
    return начало + (конец - начало) * отношение
}

let интерполированное = lerp(0, 100, 0.5)      // 50.0

// Нормализация значения
function normalize(значение: float, мин: float, макс: float) -> float {
    return (значение - мин) / (макс - мин)
}

let нормализованное = normalize(150, 100, 200) // 0.5

print("Ограниченное значение: {ограниченноеЗначение}")
print("Интерполированное: {интерполированное}")
print("Нормализованное: {нормализованное}")

📚 Функции массивов

Базовые операции с массивами

let числа = [1, 2, 3, 4, 5]

// Информация о массиве
let длинаМассива = числа.length()             // 5
let пустой = числа.isEmpty()                  // false

// Доступ к элементам
let первый = числа.first()                    // Some(1)
let последний = числа.last()                  // Some(5)
let поИндексу = числа.get(2)                  // Some(3)

// Добавление/удаление элементов
let mut изменяемыйМассив = [1, 2, 3]
изменяемыйМассив.push(4)                      // [1, 2, 3, 4]
let удалённый = изменяемыйМассив.pop()        // Some(4), массив [1, 2, 3]
изменяемыйМассив.unshift(0)                   // [0, 1, 2, 3]
let сдвинутый = изменяемыйМассив.shift()      // Some(0), массив [1, 2, 3]

print("Длина массива: {длинаМассива}")
print("Первый элемент: {первый}")
print("Изменяемый массив: {изменяемыйМассив}")

Функциональные методы массивов

let числа = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// map - преобразование
let квадраты = числа.map=> х * х)          // [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
let строки = числа.map=> х.toString())     // ["1", "2", "3", ...]

// filter - фильтрация
let чётные = числа.filter=> х % 2 == 0)    // [2, 4, 6, 8, 10]
let большие = числа.filter=> х > 5)        // [6, 7, 8, 9, 10]

// reduce - накопление
let сумма = числа.reduce((акк, тек) => акк + тек, 0)      // 55
let произведение = числа.reduce((акк, тек) => акк * тек, 1) // 3628800

// find - поиск
let найдено = числа.find=> х > 5)          // Some(6)
let найденИндекс = числа.findIndex=> х > 5) // Some(5)

print("Квадраты: {квадраты}")
print("Чётные: {чётные}")
print("Сумма: {сумма}")
print("Найдено: {найдено}")

Проверка и валидация массивов

let тестовыйМассив = [2, 4, 6, 8, 10]

// every - проверка всех элементов
let всеЧётные = тестовыйМассив.every=> х % 2 == 0)    // true
let всеБольшие = тестовыйМассив.every=> х > 5)        // false

// some - проверка некоторых элементов
let некоторыеБольшие = тестовыйМассив.some=> х > 5)   // true
let некоторыеНечётные = тестовыйМассив.some=> х % 2 == 1) // false

// includes - проверка включения
let включает6 = тестовыйМассив.includes(6)               // true
let включает7 = тестовыйМассив.includes(7)               // false

// indexOf - поиск индекса
let индекс6 = тестовыйМассив.indexOf(6)                  // Some(2)
let индекс7 = тестовыйМассив.indexOf(7)                  // None

print("Все чётные: {всеЧётные}")
print("Некоторые большие: {некоторыеБольшие}")
print("Включает 6: {включает6}")

Сортировка и преобразование массивов

let случайныйМассив = [3, 1, 4, 1, 5, 9, 2, 6]

// Сортировка
let поВозрастанию = случайныйМассив.sort()                     // [1, 1, 2, 3, 4, 5, 6, 9]
let поУбыванию = случайныйМассив.sortBy((а, б) => б - а)      // [9, 6, 5, 4, 3, 2, 1, 1]

// Удаление дубликатов
let уникальныйМассив = случайныйМассив.unique()               // [3, 1, 4, 5, 9, 2, 6]

// Обращение массива
let обращённый = случайныйМассив.reverse()                    // [6, 2, 9, 5, 1, 4, 1, 3]

// Конкатенация массивов
let массив1 = [1, 2, 3]
let массив2 = [4, 5, 6]
let объединённый = массив1.concat(массив2)                    // [1, 2, 3, 4, 5, 6]

// Нарезка массива
let нарезанный = [1, 2, 3, 4, 5, 6].slice(2, 5)              // [3, 4, 5]

print("Отсортированный массив: {поВозрастанию}")
print("Уникальный массив: {уникальныйМассив}")
print("Объединённый: {объединённый}")

🏗️ Функции объектов

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

let объектПользователя = {
    имя: "Пользователь",
    возраст: 28,
    работа: "Разработчик",
    навыки: ["Топаз", "Rust", "TypeScript"]
}

// Получение ключей/значений объекта
let ключи = Object.keys(объектПользователя)             // ["имя", "возраст", "работа", "навыки"]
let значения = Object.values(объектПользователя)        // ["Пользователь", 28, "Разработчик", [...]]
let записи = Object.entries(объектПользователя)         // [["имя", "Пользователь"], ...]

// Проверка существования свойства
let естьИмя = Object.hasOwnProperty(объектПользователя, "имя")    // true
let естьАдрес = Object.hasOwnProperty(объектПользователя, "адрес") // false

// Слияние объектов
let дополнительнаяИнформация = { адрес: "Москва", email: "dev@example.com" }
let объединённый = Object.assign(объектПользователя, дополнительнаяИнформация)

print("Ключи: {ключи}")
print("Есть имя: {естьИмя}")

Преобразование и копирование объектов

let исходныйОбъект = {
    данные: {
        число: 42,
        текст: "привет",
        массив: [1, 2, 3]
    },
    конфигурация: {
        включено: true,
        версия: "1.0"
    }
}

// Поверхностное копирование
let поверхностнаяКопия = Object.assign({}, исходныйОбъект)

// Глубокое копирование
let глубокаяКопия = Object.deepClone(исходныйОбъект)

// Заморозка и запечатывание объекта
let замороженныйОбъект = Object.freeze(исходныйОбъект)    // Неизменяемый объект
let запечатанныйОбъект = Object.seal(исходныйОбъект)      // Нельзя добавлять/удалять свойства

// Определение свойства
let новыйОбъект = {}
Object.defineProperty(новыйОбъект, "толькоДляЧтенияСвойство", {
    value: "неизменяемое",
    writable: false,
    enumerable: true
})

print("Глубокая копия: {глубокаяКопия}")
print("Заморожен: {Object.isFrozen(замороженныйОбъект)}")

🎯 Утилитарные функции

Обработка JSON

let объектДанных = {
    имя: "Топаз",
    версия: "1.0.0",
    возможности: ["безопасность", "производительность", "удобство"]
}

// Сериализация/десериализация JSON
let jsonСтрока = JSON.stringify(объектДанных)
print("JSON: {jsonСтрока}")

match JSON.parse(jsonСтрока) {
    case Ok(разобранныйОбъект) => print("Разбор успешен: {разобранныйОбъект}")
    case Err(ошибка) => print("Разбор не удался: {ошибка}")
}

// Красивый вывод JSON
let красивыйJson = JSON.stringify(объектДанных, null, 2)
print("Красивый JSON:\n{красивыйJson}")

Функции проверки типов

// Продвинутый пример определения типов через сопоставление образцов
function getType(значение: any) -> string {
    match значение {
        case null => "null"
        case _: Array<any> => "array"
        case _: Date => "date"
        case _: int => "int"
        case _: float => "float"
        case _: string => "string"
        case _: bool => "boolean"
        case _ => "object"
    }
}

let различныеЗначения = [
    42,
    "строка",
    [1, 2, 3],
    { ключ: "значение" },
    null,
    true,
    Date.now()
]

for значение in различныеЗначения {
    print("Значение: {значение}, Тип: {getType(значение)}")
}

Утилиты конкурентности

// Параллельное выполнение через concurrent (концептуально)
function задача(label: string, ms: int) -> string {
    // имитация работы (зависит от реализации)
    // sleep(ms)
    return "{label} завершена"
}

let результаты = concurrent(timeout: 3s) {
    быстро: задача("Задача 1", 1000)
    средне: задача("Задача 2", 1500)
    медленно: задача("Задача 3", 2000)
} else {
    запасной: "частичный результат"
}

print("Результаты: {результаты}")

Функциональные утилиты

// Каррирование
function curry<A, B, C>(функция: (A, B) -> C) -> (A) -> (B) -> C {
    return: A) =>: B) => функция(а, б)
}

let сложить =: int, б: int) => а + б
let каррированноеСложение = curry(сложить)
let добавить5 = каррированноеСложение(5)

print("5 + 3 = {добавить5(3)}")

// Конвейер
function pipe<A, B, C>(функция1: (A) -> B, функция2: (B) -> C) -> (A) -> C {
    return (вход: A) => функция2(функция1(вход))
}

let удвоить =: int) => х * 2
let вСтроку =: int) => х.toString()
let конвейер = pipe(удвоить, вСтроку)

print("Результат конвейера: {конвейер(21)}")    // "42"

// Мемоизация
function memoize<T, R>(функция: (T) -> R) -> (T) -> R {
    let mut кэш: Map<T, R> = Map.new()
    
    return (вход: T) => {
        if кэш.has(вход) {
            return кэш.get(вход).unwrap()
        }
        
        let результат = функция(вход)
        кэш.set(вход, результат)
        return результат
    }
}

// Пример Фибоначчи
let фибоначчи = memoize((н: int) => {
    if н <= 1 { return н }
    return фибоначчи(н - 1) + фибоначчи(н - 2)
})

print("Фибоначчи 10: {фибоначчи(10)}")

🔧 Системные функции

Окружение и время

// Информация об окружении
let текущееВремя = Date.now()                   // Текущая временная метка
let текущаяДата = Date.today()                  // Сегодняшняя дата
let isoСтрока = Date.now().toISOString()        // Формат ISO 8601

// Вычисления времени
let завтра = Date.now().addDays(1)
let прошлаяНеделя = Date.now().subtractWeeks(1)
let следующийМесяц = Date.now().addMonths(1)

print("Текущее время: {текущееВремя}")
print("ISO строка: {isoСтрока}")

// Переменные окружения (зависят от среды выполнения)
let переменнаяОкружения = System.getEnv("PATH")
let текущаяДиректория = System.getCurrentDir()

print("Текущая директория: {текущаяДиректория}")

Функции случайности

// Базовая случайность
let случайноеЧисло = Math.random()              // 0.0 ~ 1.0
let случайноеЦелое = Math.randomInt(1, 100)     // 1 ~ 100
let случайныйБулеан = Math.randomBool()         // true или false

// Случайный выбор из массива
let цвета = ["красный", "синий", "зелёный", "жёлтый"]
let случайныйЦвет = цвета.randomChoice()        // Случайный цвет

// Перемешивание массива
let колода = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let перемешанная = колода.shuffle()

print("Случайное число: {случайноеЧисло}")
print("Случайное целое: {случайноеЦелое}")
print("Случайный цвет: {случайныйЦвет}")
print("Перемешанная колода: {перемешанная}")

Основные функции Топаза делают разработку более эффективной и безопасной. Все функции гарантируют типобезопасность и поддерживают стиль функционального программирования! 🎯