# pro.01_80 Диалектика динамики типов

Рассмотрим более подробно ещё одно диалектическое противоречие: "статическая типизация -- динамическая типизация". Надо получить ясный, структурированный переход между строгой статикой и высокой динамикой. А также предусмотреть контролируемый механизм перехода из одного состояния в другое.

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

- Статика — стремление к порядку, предсказуемости, закону.
- Динамика — стремление к адаптации, изменению, практике.

> 💡 Их единство — не компромисс, а диалектический переход, где каждая сторона отрицает другую, чтобы породить нечто высшее.

## Постановка противоречия

### Плюсы

- статическая типизация: Безопасность, производительность, документация в коде
- динамическая типизация: Гибкость, быстрая разработка, адаптивность

### Минусы

- статическая типизация: Жёсткость, сложность, высокий порог входа
- динамическая типизация: возможны ошибки на этапе исполнения, трудно масштабировать, слабая документация

## Философия

- статическая типизация: идеализм порядка (мир должен быть упорядочен)
- динамическая типизация: идеализм вечного изменения (мир — поток, форма не важна)

Ни одна сторона не может победить полностью.

> 💡 Победа — в синтезе, в контролируемом переходе от одной формы к другой, в зависимости от объективных условий задачи.

**Цель**: `диалектическая типизация`

Не смешение статики и динамики, а их единство в движении, где:

- Статика — норма,
- Динамика — вынужденное отклонение,
- Переход — не хаос, а сознательный, контролируемый, документируемый акт.

## Основные принципы диалектической типизации

### Статика по умолчанию

Вся переменные, функции, атомы — строго типизированы.

### Динамика — как отрицание нормы

Разрешена только в явно обозначенных зонах.

- Переход — через форму, а не через волю
- Не просто `any`, а структурированный механизм

## Обратный переход — обязательный

Из динамики можно выйти только через проверку и приведение типа.

### Контекст определяет

- В ядре системы — только статика.
- В интерфейсе с внешним миром — динамика разрешена.

### Педагогический контроль

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

## Механизм перехода: "@вход"

Введём новую конструкцию — `@вход`, которая ограничивает пространство и время действия динамики.

`@вход` -- это форма диалектического преодоления несовершенства внешнего мира.

`@вход`, `@выход` — это не просто синтаксический сахар, это — граница между мирами, между упорядоченным миром `prolet` и хаосом внешних данных, между типизированным бытием и бестиповым небытием.

Входы и выходы всегда требуется при обмене с внешним миром. Если приём данных из внешнего источника из экосистемы `prolet` -- тогда такой поток байтовых данных будет сопровождаться метками типа. В этой ситуации контроль на входе не нужен.

```prolet
(// Внутри — следует использовать байтовый поток,
    тип на выходе -- `нечто`)
(Веб Запросить "/data" @вход
    @требует_ревью)(уст нечто)
(// тип: фиксированный срез байтов)

(// Обратный переход — только через проверку)
 (ЕслиНечто нечто как Пользователь
    тогда ((Привести нечто к Пользователь)
        (уст пользователь))
    иначе (ПечатьОшибка "неверный формат")
)
```

Особенности входа:

- всегда принимает поток байт;
- прекращает работу, если свойство `@вход` не указано, а формат байтового потока не имеет меток типов полей;
- Запрещён в критических модулях (ядро, безопасность);
- Только после ревью (для уровней < 3).

Это — не либерализм, а учёт требований объективной реальности, как *военный коммунизм → нэп → социализм*.

Суть `@вход`: граница между мирами

🌍 Два мира:

| МИР PROLET                                  | ВНЕШНИЙ МИР                                  |
| ---------------------------------------------- | ------------------------------------------------------ |
| Типы — первичны                   | Типы — отсутствуют или скрыты |
| Данные — структурированы | Данные — байтовый поток            |
| Порядок — внутренний         | Хаос — норма                                 |
| @конст, @фикс, @изм — везде  | Никаких категорий                      |

`@вход` — это не свойство, это — онтологическая граница, где байт становится сущим, а хаос — формой порядка.

## Динамический тип, как переходное состояние

Динамический тип — не тип-ловушка, а тип-процесс.

Он не может участвовать в вычислениях напрямую. Чтобы использовать — нужно привести к статическому типу.

```prolet
(// по умолчанию статичность на выходе @фикс,
  параметр контакта с внешним миром -- @вход)
(Api ПолучитьИз)(уст x)

(// Ошибка: (x + 1) — запрещено)
(ЕслиНечто x как Целое
    тогда (ОбработатьЧисло (Привести x к Целое))
    иначе (ПечатьОшибка "ожидалось число")
)
```

Это — материалистическое требование: чтобы работать с реальностью, нужно понять её структуру.

Если данные пришли от другого `prolet`-процесса, и сериализованы с метаданными (структуры в духе `prolet`), то `@вход` не нужен — это внутренний поток выраженный иными средствами для внешнего хаотического мира, как товарообмен в социалистическом хозяйстве между различными предприятиями в одной цепочке производства и в одной стране, но разных городах.

Но если данные — извне:

- `JSON` без схемы,
- бинарный протокол,
- `CSV`,
- `XML` с xsi:type="string"

тогда нужен `@вход`, потому что форма несёт в себе противоречие: `байты есть, а типов — нет`.

## Система приведения типов: "путь к статике"

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

- `(ЕслиНечто х как Пользователь)` Булево, безопасно
- Безопасное извлечение типа

```prolet
(ЕслиНечто х как Пользователь
    тогда (Обработать (Привести х к Пользователь))
    иначе (ПечатьОшибка "ожидался пользователь")
)
```

Приведение с проверкой `(Привести х к Пользователь)(уст х @изм)` падает, если не подходит.

### Функциональный стиль

Схемная валидация для сложных форматов:

```prolet
(ЕслиНечто байты к Пользователь
    тогда ((Привести байты в Пользователь)
           (уст х))
    иначе (ПечатьОшибка "ожидалось число")
)
```

Переход из динамики в статику — не автоматический, а требующий сознательного усилия, как переход от чувственного восприятия к рациональному пониманию.

## Контекстно-зависимая типизация: где разрешена динамика?

- ввод: файлы (Внешний мир не контролируется),
- ввод: внешние **API** (не из экосистемы),
- ввод: конфигурация (не из экосистемы).

> 💡 Это — не абсолютизация, а диалектический релятивизм: истина — в конкретной практике, границы которой задаются контекстом.

## Развитие типов: от динамики к статике через практику

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

```prolet
(// Сначала — динамически,
  "ЗапросАпи" определён как @вход, и данные как @фикс)
(прц ЗапросАпи @вход() нечто(
  ....)
)
(ЕслиНечто нечто как ФорматV1
    тогда (...)
    иначе (...)
)

(// Через месяц практики — выносим в структуру)
(структ ФорматV1
  @поле1 НакладнаяНазвание
  @поле2 СписокЦелое)

(// Использование через приведение, результат определён как @фикс)
(ЕслиНечто х как ФорматV1
    тогда ((ЧитатьИз "data/sample.json")
           (уст конфигТекст))
)
```

Это — отрицание отрицания: динамика отрицает статику, но на основе практического действия — порождает заново безопасную статику.

## Почему именно `@вход`, а не просто функция?

Потому что:

- Это — не вычисление,
- Это — переход количества в качество,
- Это — восстановление формы из хаоса.

> 💡 Как у диалектики: `Из хаоса — порядок, из количества — качество`.

## Почему `@вход` — однонаправленный?

Потому что:

- Вход — из байт → в типизированное сущее — требует труда, проверки, интерпретации,
- Выход — из `prolet` → в байты — может быть автоматическим, если используется самоописывающий формат (например, `prolet-bin` с метками типов).

Но если выход — в неструктурированный формат (например, `raw TCP`), то нужен обратный шлюз — `@выход`:

```lisp
(фн Отправить @выход (Пользователь x)
    @цель legacy_система(
   (СериализоватьБезТипов x)
)
```

Это — единство и борьба: вход и выход — разные по природе, потому что мир в динамике асимметричен.

## Что делает `@вход` на уровне ВМ?

При встрече `@вход`:

- Активируется режим проверки:
- Все значения извне — являются срезом байт.
- Нельзя использовать напрямую.

Требуется явное приведение:

- `(Привести х к Пользователь)` → с проверкой.
- Или — `(ЕслиНечто ... как СхемаХХХ)`.

Фиксируется событие:

- В лог: `(@выход @логОткл)` (по умолчанию активно).
- В граф жизненного цикла — новая ветвь анализа.

## Психологические и педагогические механизмы

💡 Для новичка:

- Динамика отключена.
- При попытке использовать — подсказка: "Динамические типы доступны после прохождения модуля 'Работа с внешними данными'".

💡 Для мастера:

- Можно использовать динамический шлюз,
- но только с обоснованием, и с автоматическим логированием всех операций (включено по умолчанию).

💡 Для системы:

- Все динамические участки автоматически документируются.
- Нет идеалистических типов данных (всегда присутствует байтовый поток).
- При стабилизации — предлагает: "Этот шлюз использован 100 раз. Создать статический тип?" (возможна автоматическая генерация обратимого конвертера)

## Пример: полный цикл перехода

```prolet
(// Внешний API — неизвестная структура)
(Веб Запросить "https://api.partner/data" @вход)
(уст нечто)

(// Проверка и переход к статике)
(ЕслиНечто нечто как АнализДанных)
    тогда ((Привести нечто в АнализДанных)
           (уст отчёт @изм)
           (ОтправитьОтчёт отчёт))
    иначе (ПечататьОшибку "некорректные данные"))

(// Определение типа на основе практики)
(атом АнализДанных
  @показатель ПроцентПлана
  @дата       АбсолютнаяМетка
  @регион     РегионПеречисление
  @_док       "Анализ данных по регионам с привязкой по времени")
```

От хаоса внешнего мира → к порядку внутренней системы через безопасные однонаправленные шлюзы.

## 🎯 Заключение: типизация как диалектический процесс

Предлагаемое решение не устраняет противоречие, а развивает отношения внутренних форм в конкретной ситуации:

- Статика — не догма, а результат победы над хаосом,
- Динамика — не свобода, а временное отступление перед объективной необходимостью, но без отрыва от реальности,
- Переход — не скачок, а контролируемый, документируемый, педагогически организованный процесс,
- Язык — не набор правил, а механизм познания реальности через типы.

> ✅ Это — не просто типовая система, это — диалектика познания: *от незнания → к гипотезе (динамика) → к истине (статика).*
