Введение в SmirnovLang

SmirnovLang — это современный язык программирования с инновационными возможностями, созданный для быстрой разработки и выражения идей в коде.

Почему SmirnovLang?

  • Современный синтаксис — чистый и выразительный
  • Встроенные фичи — SQL-запросы, контракты, тестирование
  • 100+ функций — всё, что нужно, уже есть
  • Уникальные возможности — time travel debugging, квантовые вычисления
  • Простота — легко выучить, приятно использовать

Установка

Windows

# Через инсталлятор
# Скачайте с https://github.com/ainsonet/smirnovlang/releases

# Или через Chocolatey
choco install smirnovlang

Linux/macOS

# Клонировать репозиторий
git clone https://github.com/ainsonet/smirnovlang.git
cd smirnovlang

# Собрать
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

Быстрый старт

Создайте файл hello.smirnov:

fn main() {
    let name = "World";
    println("Hello, " + name + "!");
}

Запустите:

smirnovLang hello.smirnov

Переменные

// Неизменяемая переменная
let x = 42;

mut y = 10;
y = 20;

// Scoped variable (исчезает после блока)
{
    let! temp = 100;
    println(temp); // 100
}
// temp здесь не определён

Типы данных

// Базовые типы
let integer: int = 42;
let floating: f64 = 3.14;
let text: string = "Hello";
let flag: bool = true;

// Массивы
let numbers = [1, 2, 3, 4, 5];

// Структуры
struct Point {
    x: f64,
    y: f64,
}

let p = Point { x: 10, y: 20 };

Функции

// Базовая функция
fn add(a: int, b: int) -> int {
    return a + b;
}

// Функция с контрактами
fn divide(a: f64, b: f64) -> f64
    require b != 0, "b cannot be zero"
    ensure result >= 0, "result must be non-negative"
{
    return a / b;
}

// Lambda-выражения
let multiply = |x, y| -> x * y;
let result = multiply(5, 3);

Управление потоком

// Условные выражения
if x > 10 {
    println("Greater than 10");
} else if x == 10 {
    println("Equals 10");
} else {
    println("Less than 10");
}

// Циклы
for i in 0..10 {
    println(i);
}

while condition {
    // ...
}

Pattern Matching

fn describe(value: int) -> string {
    match value {
        0 -> "zero",
        1 | 2 | 3 -> "small",
        n if n > 100 -> "large",
        _ -> "medium"
    }
}

Контракты

Контракты обеспечивают корректность функций через пред- и постусловия:

fn calculate(x: f64) -> f64
    require x > 0, "x must be positive"
    ensure result > 0, "result must be positive"
    fix: abs(result)
{
    return x * 2;
}

Pipeline

// Pipeline-выражения для читаемости
let result = [1, 2, 3, 4, 5]
    |> filter(x => x % 2 == 0)
    |> map(x => x * 2)
    |> sum();

// Эквивалентно:
let result = sum(map(filter([1, 2, 3, 4, 5], x => x % 2 == 0), x => x * 2));

SQL-подобные запросы

let users = [
    {name: "Alice", age: 25},
    {name: "Bob", age: 17},
    {name: "Charlie", age: 30}
];

let adults = select * from users 
              where age > 18 
              order by name;

// Выборка полей с LIMIT
let names = select name from users 
             limit 2 offset 0;

Data Versioning

let data = {x: 10, y: 20};

// Сохраняем версию
commit(data, "v1");

// Модифицируем
data.x = 100;
commit(data, "v2");

// Восстанавливаем
let restored = rollback("v1");

// Смотрим историю
history("v1");

// Сравниваем версии
diff(rollback("v1"), rollback("v2"));

Time Travel Debugging

let data = [1, 2, 3, 4, 5];

// Создаем контрольные точки
timeTravel("record");
let modified = data |> map(x => x * 2);
timeTravel("record");

// Возвращаемся назад
timeTravel("rewind");

// Проверяем timeline
let checkpoints = timeTravel("timeline");

Встроенные функции

Более 100 встроенных функций:

Основные

  • print(), println() — вывод
  • len(), type() — информация о значениях
  • toInt(), toFloat(), toString() — конвертация

Математика

  • sqrt(), pow(), abs(), min(), max()
  • sin(), cos(), tan() — тригонометрия

Массивы

  • map(), filter(), reduce(), sum()
  • push(), reverse(), slice(), chunk()
  • first(), last(), take(), drop()

Строки

  • split(), trim(), join(), concat()
  • replace(), substring()

Стандартная библиотека

Для получения актуальной информации см. исходный код в репозитории:

Посмотреть на GitHub