Введение в 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()
Стандартная библиотека
Для получения актуальной информации см. исходный код в репозитории: