# Лексика — руководство языка

**Лексика** — язык программирования, построенный целиком на русском языке.
**Лексус** — движок и компилятор этого языка, написанный с нуля: свой разбор,
своя морфология, свой исполнитель. Логика взята не «из Питона», а из русского
языка: **падеж говорит движку, что означает слово**.

Файлы кода заканчиваются на `.lek` — своё расширение вместо `.py`.
Компилятор зовётся `лексус`. Другие написания названия: Лекс, Лексик, лекс,
Лексус, «язык программирования Л».

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

---

## 1. Правила письма

В языке разрешены **только** русские слова, цифры и пять знаков:

```
. , ! ? ( )
```

| запрещено | чем заменить |
|---|---|
| `"кавычки"` | `речь … конец речи` |
| `{}` `[]` | слова `конец если`, `конец пока`, `перечень(…)` |
| `:` `;` | слово `то` |
| `_` | слитное слово: `числаопыта` |
| `#`, `//`, `/* */` | `заметка …` до конца строки |
| `=`, `==`, `+`, `-`, `*`, `/` | `равно`, `плюс`, `минус`, `умножить` |
| латиница | русское слово |

Точка, восклицательный и вопросительный знаки **завершают действие** — все
три равноправны, поэтому писать можно с интонацией.

Строка открывается словом `речь` и закрывается словами `конец речи`:

```лексика
сказать речь Здравствуй, мир! конец речи.
```

Внутри речи круглые скобки вставляют значение:

```лексика
сказать речь Всего (сумма) штук конец речи.
```

Двойная скобка даёт обычную: `речь скобка (( и )) знак конец речи` напечатает
`скобка ( и ) знак`.

---

## 2. Установка

### Windows

Готовый установщик — `сборка/Лексус-установщик.exe`. Это настоящий
исполняемый файл Windows, около 22 МБ. Внутри уже лежит всё: движок Лексус в
файлах `.lek`, примеры, словари, словарь языка, документы и встроенный
python для Windows. Скачивать ничего не нужно, права администратора тоже.

| дело | как |
|---|---|
| поставить | двойной щелчок по `Лексус-установщик.exe` |
| поставить молча | `Лексус-установщик.exe --тихо` |
| снять | `Лексус-установщик.exe --удалить` |

Установщик кладёт всё в `%LOCALAPPDATA%\Лексус`, ставит ярлык «Лексика» на
рабочий стол и в меню «Пуск», прописывает свой каталог в путь текущего
пользователя и сам себя проверяет на примере. После установки в новых окнах
командной строки работает команда `лексус`:

```
лексус запустить примеры\привет.lek
лексус справка
```

### Linux и macOS

Нужен только `python3` версии 3.8 или новее.

```sh
sh установить.sh
```

Установщик разложит движок в `~/.лексус`, поставит ярлык `лексус` в
`~/.local/bin` и проверит работу на примере. Другие пути:

```sh
python3 установить.lek --папка ~/моялексика --куда ~/.local/bin
python3 установить.lek --снести
```

### Без установки

```sh
python3 лексус.lek запустить примеры/привет.lek
python3 проверка/тесты.lek
```

### Сборка установщика своими руками

```sh
sudo apt-get install mingw-w64
python3 сборка/собрать_exe.lek
python3 сборка/собрать_exe.lek --без-питона     заметка установщик на 0,6 МБ
```

---

## 3. Первая программа

```лексика
заметка Первая программа
пусть имя равно Пётр.
сказать речь Здравствуй, (имя)! конец речи.
```

---

## 4. Имена и падежи — главная мысль языка

Имя переменной — русское слово. Движок склоняет его сам, поэтому имя
узнаётся в любой форме. Все эти строки работают с одной и той же переменной:

```лексика
пусть сумма равно пяти.
положить десять в сумму.        заметка винительный падеж
прибавить два к сумме.          заметка дательный падеж
сказать сумму.                  заметка винительный
сказать длина суммы.            заметка родительный
```

Глагол задаёт падеж, падеж задаёт смысл:

| по-русски | что делает движок |
|---|---|
| `положить пять в сумму` | записывает в имя `сумма` |
| `прибавить два к сумме` | `сумма = сумма + 2` |
| `отнять два от суммы` | `сумма = сумма − 2` |
| `увеличить сумму на два` | `сумма = сумма + 2` |
| `умножить сумму на два` | `сумма = сумма × 2` |
| `сказать длина суммы` | печатает длину значения имени `сумма` |

Имена бывают во множественном числе, и это тоже работает:

```лексика
пусть покупки равно перечень().
добавить в покупки Хлеб.
сказать длина покупок.          заметка родительный множественного
взять из покупок ноль.
```

> Слово с заглавной буквы, которого нет среди имён, считается **значением**
> само по себе: `перечень(Хлеб, Соль)`. Слово со строчной буквы обязано быть
> заведённым именем — опечатку движок заметит и объяснит.

---

## 5. Значения

| вид | как пишется | пример |
|---|---|---|
| число | цифрами или словами | `42`, `3 запятая пять`, `сорок два`, `две тысячи пятьсот` |
| речь | `речь … конец речи` | `речь Привет конец речи` |
| истина | `истина`, `правда`, `да` | `истина` |
| ложь | `ложь`, `неправда`, `нет` | `ложь` |
| ничто | `ничто`, `пусто` | `ничто` |
| перечень | `перечень(…)` | `перечень(один, два)` |
| словарь | `словарь()` | `словарь()` |

Дробная часть отделяется словом `запятая`: `три запятая пять` — это `3,5`.
На печати дробь выводится с запятой: `4,5`.

---

## 6. Действия

### Имена и значения

```лексика
пусть счёт равно нулю.          заметка завести имя
счёт равен пяти.                заметка присвоить (имя в именительном)
положить пять в счёт.           заметка присвоить (имя в винительном)
увеличить счёт на два.          заметка прибавить к имени
уменьшить счёт на два.          заметка отнять от имени
умножить счёт на два.           заметка умножить имя
разделить счёт на два.          заметка разделить имя
прибавить два к счёту.          заметка дательный падеж
отнять два от счёта.            заметка родительный падеж
```

### Речь и ввод

```лексика
сказать выражение.
спросить имя.
```

### Ветвление

```лексика
если счёт больше десяти то
    сказать речь Много конец речи.
иначе если счёт равно десяти то
    сказать речь Ровно десять конец речи.
иначе
    сказать речь Мало конец речи.
конец если.
```

Слово `то` обязательно: оно отделяет условие от действий.
Замысел закрывается словами `конец если` (или просто `конец`).

### Циклы

```лексика
пока счёт меньше трёх повторять
    увеличить счёт на один.
конец пока.

повторить три раза
    сказать речь Ура! конец речи.
конец повтора.

для каждого предмета из покупок повторять
    сказать предмет.
конец для.
```

`прервать` выходит из цикла, `продолжить` переходит к следующему витку.

### Правила (подпрограммы)

Правило объявляется словом `правило`, имена значений вводятся словом
`принимает` в винительном падеже:

```лексика
правило приветствие принимает кто повторять
    сказать речь Здравствуй, (кто)! конец речи.
конец правила.

правило здравие принимает кто повторять
    вернуть речь Здравия желаю, (кто)! конец речи.
конец правила.

позвать приветствие с Пётр.              заметка вызвать как действие
сказать здравие(Иван).                   заметка вызвать как значение
```

Правила собираются до исполнения, поэтому порядок объявления не важен.
Вложенность и возврат значения поддерживаются.

### Словари правил (подключение)

```лексика
подключить числа.
сказать чётное(двенадцать).
```

Файл `числа.lek` ищется в папке программы, в `словари/` движка и в
библиотеке наложенных заплаток.

---

## 7. Выражения

Старшинство — как в обычной математике, знаками-словами:

```
или
и
больше  меньше  равно  не равно  не больше  не меньше  содержит
плюс  минус
умножить на   разделить на   остаток от
в степени
не   минус (унарный)
```

Примеры:

```лексика
сказать два плюс три умножить на четыре.          заметка 14
сказать (два плюс три) умножить на четыре.        заметка 20
сказать семь остаток от двух.                     заметка 1
сказать истина и не ложь.                         заметка да
сказать пять в степени три.                       заметка 125
сказать речь да конец речи плюс речь нет конец речи.
```

---

## 8. Перечни и словари

```лексика
пусть покупки равно перечень().
добавить в покупки Хлеб.
добавить в покупки Молоко.
сказать длина покупок.
сказать взять из покупок ноль.
убрать из покупок ноль.

пусть цены равно словарь().
записать в цены по ключу Хлеб тридцать.
сказать прочитать из цен по ключу Хлеб.
сказать ключи(цены).
```

Нумерация начинается с нуля. Слово `номер` можно писать, можно опускать:
`взять из покупок три` и `взять из покупок номер три` — одно и то же.

---

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

```лексика
сказать число(речь 42 конец речи).
сказать строка(42).
сказать модуль(минус пять).
сказать корень(девяти).
сказать округлить(три запятая семь).
сказать целое(три запятая семь).
сказать случайное(один, шесть).
сказать остаток(десять, три).
сказать ключи(цены).
сказать буквы(слово).
сказать время().
```

Полный список с примерами — в [СЛОВАРЬ.md](СЛОВАРЬ.md).

---

## 10. Заплатки

Программа пакуется в один файл `.патч` — наш контейнер `LEKSUSPK` с манифестом и
отпечатками файлов.

```sh
лексус собрать примеры/угадай.lek --версия 1.0.0 --автор "Мастер"
лексус наложить угадай.патч
лексус запустить угадай
лексус заплатки
лексус откатить угадай
```

Что внутри заплатки:

```
манифест.json     имя, версия, автор, точка входа, отпечатки файлов
код/…             исходники на Лексика
запуск            оболочка-ярлык для запуска заплатки
читай.lek        образец обращения к заплатке
```

При наложении каждый файл сверяется по отпечатку: испорченная заплатка
не установится. Заплатка — это и есть способ «добавить программу в патч».

---

## 11. Разум языка: крошечные модели

Внутри движка есть **встроенная крошечная модель**: таблицы склонений,
окончаний и частот, около двухсот килобайт. Она разбирает падеж, число и
род, не требует сети и графического ускорителя.

Переключатели (файл `~/.лексус/настройки.json`, правится делом `настройка`):

```sh
лексус настройки
лексус настройка умная_модель выключена
лексус настройка умная_модель внешняя
лексус настройка путь_к_модели /путь/к/модели.gguf
лексус настройка движок_модели llama.cpp
лексус настройка разрешить_толкование да
```

Три состояния:

| режим | что делает |
|---|---|
| `встроенная` | таблицы движка, работает всегда и мгновенно |
| `выключена` | только правила склонения, без советчика |
| `внешняя` | любая модель с открытыми весами как советчик по падежам и толкователь |

Подходящие крошечные модели (список печатает `лексус модели`):

| модель | вес | зачем |
|---|---|---|
| `cointegrated/rubert-tiny2` | ≈ 45 МБ, 12 млн параметров | разбор падежа, числа и рода |
| `Vikhr-Qwen-2.5-0.5b-Instruct-GGUF` | ≈ 400 МБ в Q4_K_M | творческое толкование, подсказки для незнакомых слов |
| `qwen2.5:0.5b` (ollama) | ≈ 400 МБ | быстрый запуск внешней модели |

Внешняя модель никогда не решает за язык: она только подсказывает, когда
правила дают несколько равноправных разборов.

---

## 12. Ошибки

Сообщения всегда по-русски и с местом в тексте:

```
ошибка письма: строка 3, знак 14: знак «_» запрещён
  подсказка: в Лексика нет кавычек, скобок иных форм и префиксов:
  пользуйтесь словами и только знаками . , ! ? ( )

ошибка смысла: неизвестное имя «сумму»
  подсказка: если это просто слово, напишите речь сумму конец речи,
  а если имя — заведите его словом «пусть»
```

---

## 13. Дела движка

```
лексус запустить файл.lek        исполнить программу на своей машине
лексус запустить --дерево файл   исполнить обходом дерева, для отладки
лексус проверить файл.lek        проверить письмо и грамматику
лексус собрать файл.lek          собрать заплатку
лексус наложить имя.патч          наложить заплатку
лексус откатить имя               снять заплатку
лексус заплатки                   что уже наложено
лексус словарь [слово]            словарь языка
лексус склонять слово             все падежные формы слова
лексус разобрать слово            разбор слова движком и вес решения
лексус настройки                  настройки разума
лексус настройка ключ значение    изменить настройку
лексус разум                      состояние своего разума языка
лексус байткод файл.lek           показать байткод программы
лексус модели                     какие крошечные модели подходят
лексус толковать вопрос           спросить у внешней модели
лексус форматы                    русские расширения файлов
лексус формат файл                перевести имя файла на русское
лексус примеры                    список примеров
лексус беседа                     живая беседа, строка за строкой
```

---

## 13а. Русские расширения

Форматами язык зовёт файлы по-русски. Настоящее расширение остаётся, но имя
можно перевести одной командой.

| русское | настоящее | что это |
|---|---|---|
| `.зип` | `.zip` | сжатый набор файлов |
| `.7з` | `.7z` | плотный сжатый набор |
| `.трек3` | `.mp3` | звук |
| `.огг` | `.ogg` | звук |
| `.вид4` | `.mp4` | видео |
| `.вебм` | `.webm` | видео для сети |
| `.пнг` | `.png` | картинка без потерь |
| `.жпег` | `.jpg` | фотокартинка |
| `.жаба` | `.java` | исходник жабы |
| `.патч` | — | наша заплатка |
| `.настр` | — | наши настройки |
| `.список` | — | наш список наложенного |

```sh
лексус формат снимок.png                  снимок.пнг
лексус формат снимок.пнг --обратно        снимок.png
лексус формат снимок.png --переименовать  переименует файл на диске
```

---

## 14. Пример целиком

```лексика
заметка Считаем стоимость покупок

правило цена принимает предмет повторять
    если предмет равно Хлеб то
        вернуть тридцать.
    конец если.
    если предмет равно Молоко то
        вернуть шестьдесят.
    конец если.
    вернуть ноль.
конец правила.

пусть покупки равно перечень(Хлеб, Молоко, Сыр).
пусть итог равно нулю.

для каждого предмета из покупок повторять
    пусть стоимость равно цена(предмет).
    увеличить итог на стоимость.
    сказать речь (предмет) стоит (стоимость) рублей. конец речи.
конец для.

сказать речь Итого (итог) рублей. конец речи.
```

---

Дальше: [СЛОВАРЬ.md](СЛОВАРЬ.md) — все слова и функции,
[АРХИТЕКТУРА.md](АРХИТЕКТУРА.md) — как устроен движок.
