|
@@ -0,0 +1,287 @@
|
|
|
|
|
+# Диалектика динамики типов
|
|
|
|
|
+
|
|
|
|
|
+Рассмотрим более подробно ещё одно диалектическое противоречие: "статическая типизация -- динамическая типизация". Надо получить ясный, структурированный переход между строгой статикой и высокой динамикой. А также предусмотреть контролируемый механизм перехода из одного состояния в другое.
|
|
|
|
|
+
|
|
|
|
|
+Это не просто технический выбор между безопасностью и гибкостью, а борьба форм отражения объективной реальности в сознании программиста.
|
|
|
|
|
+
|
|
|
|
|
+- Статика — стремление к порядку, предсказуемости, закону.
|
|
|
|
|
+- Динамика — стремление к адаптации, изменению, практике.
|
|
|
|
|
+
|
|
|
|
|
+Их единство — не компромисс, а диалектический переход, где каждая сторона отрицает другую, чтобы породить нечто высшее.
|
|
|
|
|
+
|
|
|
|
|
+## Постановка противоречия
|
|
|
|
|
+
|
|
|
|
|
+### Плюсы
|
|
|
|
|
+
|
|
|
|
|
+- статическая типизация: Безопасность, производительность, документация в коде
|
|
|
|
|
+- динамическая типизация: Гибкость, быстрая разработка, адаптивность
|
|
|
|
|
+
|
|
|
|
|
+### Минусы статической типизации
|
|
|
|
|
+
|
|
|
|
|
+- статическая типизация: Жёсткость, сложность, высокий порог входа
|
|
|
|
|
+- динамическая типизация: возможны ошибки на этапе исполнения, трудно масштабировать, слабая документация
|
|
|
|
|
+
|
|
|
|
|
+## Философия
|
|
|
|
|
+
|
|
|
|
|
+- статическая типизация: идеализм порядка (мир должен быть упорядочен)
|
|
|
|
|
+- динамическая типизация: идеализм вечного изменения (мир — поток, форма не важна)
|
|
|
|
|
+
|
|
|
|
|
+Ни одна сторона не может победить полностью.
|
|
|
|
|
+
|
|
|
|
|
+Победа — в синтезе, в контролируемом переходе от одной формы к другой, в зависимости от объективных условий задачи.
|
|
|
|
|
+
|
|
|
|
|
+**Цель**: `диалектическая типизация`
|
|
|
|
|
+
|
|
|
|
|
+Не смешение статики и динамики, а их единство в движении, где:
|
|
|
|
|
+
|
|
|
|
|
+- Статика — норма,
|
|
|
|
|
+- Динамика — вынужденное отклонение,
|
|
|
|
|
+- Переход — не хаос, а сознательный, контролируемый, документируемый акт.
|
|
|
|
|
+
|
|
|
|
|
+## Основные принципы диалектической типизации
|
|
|
|
|
+
|
|
|
|
|
+### Статика по умолчанию
|
|
|
|
|
+
|
|
|
|
|
+Вся переменная, функция, структура — строго типизированы.
|
|
|
|
|
+
|
|
|
|
|
+### Динамика — как отрицание нормы
|
|
|
|
|
+
|
|
|
|
|
+Разрешена только в явно обозначенных зонах.
|
|
|
|
|
+
|
|
|
|
|
+- Переход — через форму, а не через волю
|
|
|
|
|
+- Не просто `any`, а структурированный механизм
|
|
|
|
|
+
|
|
|
|
|
+## Обратный переход — обязательный
|
|
|
|
|
+
|
|
|
|
|
+Из динамики можно выйти только через проверку и приведение типа.
|
|
|
|
|
+
|
|
|
|
|
+### Контекст определяет
|
|
|
|
|
+
|
|
|
|
|
+- В ядре системы — только статика.
|
|
|
|
|
+- В интерфейсе с внешним миром — динамика разрешена.
|
|
|
|
|
+
|
|
|
|
|
+### Педагогический контроль
|
|
|
|
|
+
|
|
|
|
|
+Новичок не может использовать динамику без одобрения.
|
|
|
|
|
+
|
|
|
|
|
+## Механизм перехода: "шлюз"
|
|
|
|
|
+
|
|
|
|
|
+Введём новую конструкцию — `шлюз`,
|
|
|
|
|
+который ограничивает пространство и время действия динамики.
|
|
|
|
|
+
|
|
|
|
|
+Динамический шлюз -- это форма диалектического преодоления несовершенства внешнего мира.
|
|
|
|
|
+
|
|
|
|
|
+`@шлюз-вход`, `@шлюз-выход` — это не просто синтаксический сахар, это — граница между мирами, между упорядоченным миром `prolet` и хаосом внешних данных, между типизированным бытием и бестиповым небытием.
|
|
|
|
|
+
|
|
|
|
|
+Шлюз не всегда требуется при обмене с внешним миром. Если приём данных из внешнего источника из экосистемы `prolet` -- тогда такой поток байтовых данных будет сопровождаться метками типа. В этой ситуации шлюз не нужен.
|
|
|
|
|
+
|
|
|
|
|
+```lisp
|
|
|
|
|
+(// Внутри — следует использовать байтовый поток)
|
|
|
|
|
+(фикс данные (= веб-запрос "/data"
|
|
|
|
|
+ @шлюз-вход
|
|
|
|
|
+ @требует-ревью))
|
|
|
|
|
+(// тип: фиксированный срез байтов)
|
|
|
|
|
+
|
|
|
|
|
+(// Обратный переход — только через проверку)
|
|
|
|
|
+ (если (проверить-форму данные как Структ.Пользователь)
|
|
|
|
|
+ тогда (обработать-пользователя данные)
|
|
|
|
|
+ иначе (ошибка "неверный формат"))
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Особенности шлюза:
|
|
|
|
|
+
|
|
|
|
|
+- всегда принимает поток байт.
|
|
|
|
|
+- прекращает работу, если атрибут `@шлюз-вход` не указан, а формат байтового потока не имеет меток типов полей.
|
|
|
|
|
+- Запрещён в критических модулях (ядро, безопасность).
|
|
|
|
|
+- Только после ревью (для уровней < 3).
|
|
|
|
|
+
|
|
|
|
|
+Это — не либерализм, а учёт требований объективной реальности, как военный коммунизм → нэп → социализм.
|
|
|
|
|
+
|
|
|
|
|
+Суть `@шлюз-вход`: граница между мирами
|
|
|
|
|
+
|
|
|
|
|
+🌍 Два мира:
|
|
|
|
|
+
|
|
|
|
|
+```text
|
|
|
|
|
+МИР PROLET ВНЕШНИЙ МИР
|
|
|
|
|
+Типы — первичны Типы — отсутствуют или скрыты
|
|
|
|
|
+Данные — структурированы Данные — байтовый поток
|
|
|
|
|
+Порядок — внутренний Хаос — норма
|
|
|
|
|
+конст, фикс, мут — везде Никаких категорий
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+`@шлюз-вход` — это не функция, это — онтологическая граница, где байт становится сущим, а хаос — формой порядка.
|
|
|
|
|
+
|
|
|
|
|
+## Динамический тип, как переходное состояние
|
|
|
|
|
+
|
|
|
|
|
+Динамический тип — не тип-ловушка, а тип-процесс.
|
|
|
|
|
+
|
|
|
|
|
+Он не может участвовать в вычислениях напрямую. Чтобы использовать — нужно привести к статическому типу.
|
|
|
|
|
+
|
|
|
|
|
+```lisp
|
|
|
|
|
+(фикс x ()= получить-из-API()
|
|
|
|
|
+ `@шлюз-вход`)
|
|
|
|
|
+
|
|
|
|
|
+(// Ошибка: (x + 1) — запрещено)
|
|
|
|
|
+(если (x тип-число?)
|
|
|
|
|
+ тогда (обработать-число (как-число x))
|
|
|
|
|
+ иначе (ошибка "ожидалось число"))
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Это — материалистическое требование: чтобы работать с реальностью, нужно понять её структуру.
|
|
|
|
|
+
|
|
|
|
|
+Если данные пришли от другого prolet-процесса, и сериализованы с метаданными (структуры в духе `prolet`), то `@шлюз-вход` не нужен — это внутренний поток выраженный иными средствами для внешнего хаотического мира, как товарообмен в социалистическом хозяйстве между различными предприятиями в одной цепочке производства и в одной стране, но разных городах.
|
|
|
|
|
+
|
|
|
|
|
+Но если данные — извне:
|
|
|
|
|
+
|
|
|
|
|
+- JSON без схемы,
|
|
|
|
|
+- бинарный протокол,
|
|
|
|
|
+- CSV,
|
|
|
|
|
+- XML с xsi:type="string" —
|
|
|
|
|
+
|
|
|
|
|
+тогда нужен `@шлюз-вход`, потому что форма несёт в себе противоречие: `байты есть, а типов — нет`.
|
|
|
|
|
+
|
|
|
|
|
+## Система приведения типов: "путь к статике"
|
|
|
|
|
+
|
|
|
|
|
+Проверка типа:
|
|
|
|
|
+
|
|
|
|
|
+`(если (= тип-структура? Пользователь))` Булево, безопасно
|
|
|
|
|
+
|
|
|
|
|
+Приведение с проверкой `(фикс х (= тип Пользователь из дата)` Падает, если не подходит
|
|
|
|
|
+
|
|
|
|
|
+Безопасное извлечение типа `(если-тип как Пользователь х) тогда обработать)`
|
|
|
|
|
+
|
|
|
|
|
+Функциональный стиль
|
|
|
|
|
+
|
|
|
|
|
+Схемная валидация (привести к Схема.Пользователь х) для сложных форматов
|
|
|
|
|
+
|
|
|
|
|
+Переход из динамики в статику — не автоматический, а требующий сознательного усилия, как переход от чувственного восприятия к рациональному пониманию.
|
|
|
|
|
+
|
|
|
|
|
+## Контекстно-зависимая типизация: где разрешена динамика?
|
|
|
|
|
+
|
|
|
|
|
+- ввод: файлы (Внешний мир не контролируется)
|
|
|
|
|
+- ввод: внешние API (не из экосистемы)
|
|
|
|
|
+- ввод: конфигурация (не из экосистемы)
|
|
|
|
|
+
|
|
|
|
|
+Это — не абсолютизация, а диалектический релятивизм: истина — в конкретной практике.
|
|
|
|
|
+
|
|
|
|
|
+## Развитие типов: от динамики к статике через практику
|
|
|
|
|
+
|
|
|
|
|
+Когда динамический интерфейс стабилизируется, его можно возвысить до статического закона:
|
|
|
|
|
+
|
|
|
|
|
+```lisp
|
|
|
|
|
+(// Сначала — динамически)
|
|
|
|
|
+(фикс данные (= запрос-API
|
|
|
|
|
+ @шлюз-вход))
|
|
|
|
|
+ (если (проверить-форму данные как ФорматV1)
|
|
|
|
|
+ тогда ...)
|
|
|
|
|
+
|
|
|
|
|
+(// Через месяц практики — выносим в структур)
|
|
|
|
|
+(структ ФорматV1
|
|
|
|
|
+ @поле1: Строка
|
|
|
|
|
+ @поле2: Список.Целое)
|
|
|
|
|
+
|
|
|
|
|
+(// Использование через приведение)
|
|
|
|
|
+(если-тип как ФорматV1 х
|
|
|
|
|
+ тогда читать-из "data/sample.json")
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Это — отрицание отрицания: динамика отрицает статику, но на основе практического действия — порождает заново безопасную статику.
|
|
|
|
|
+
|
|
|
|
|
+## Почему именно `@шлюз-вход`, а не просто функция?
|
|
|
|
|
+
|
|
|
|
|
+Потому что:
|
|
|
|
|
+
|
|
|
|
|
+- Это — не вычисление,
|
|
|
|
|
+- Это — переход количества в качество,
|
|
|
|
|
+- Это — восстановление формы из хаоса.
|
|
|
|
|
+
|
|
|
|
|
+Как у диалектики: `Из хаоса — порядок, из количества — качество`.
|
|
|
|
|
+
|
|
|
|
|
+## Почему `@шлюз-вход` — однонаправленный?
|
|
|
|
|
+
|
|
|
|
|
+Потому что:
|
|
|
|
|
+
|
|
|
|
|
+- Вход — из байт → в типизированное сущее — требует труда, проверки, интерпретации.
|
|
|
|
|
+- Выход — из `prolet` → в байты — может быть автоматическим, если используется самоописывающий формат (например, `prolet-bin` с метками типов).
|
|
|
|
|
+
|
|
|
|
|
+Но если выход — в неструктурированный формат (например, `raw TCP`), то нужен обратный шлюз — `@шлюз-выход`:
|
|
|
|
|
+
|
|
|
|
|
+```lisp
|
|
|
|
|
+(фн отправить (x)
|
|
|
|
|
+ @шлюз-выход
|
|
|
|
|
+ @цель: legacy-система
|
|
|
|
|
+ (сериализовать-без-типов x))
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Это — единство и борьба: вход и выход — разные по природе, потому что мир несимметричен.
|
|
|
|
|
+
|
|
|
|
|
+## Что делает `@шлюз-вход` на уровне ВМ?
|
|
|
|
|
+
|
|
|
|
|
+При встрече `@шлюз-вход`:
|
|
|
|
|
+
|
|
|
|
|
+- Активируется режим проверки:
|
|
|
|
|
+- Все значения извне — помечаются как `@возможно`.
|
|
|
|
|
+- Нельзя использовать напрямую.
|
|
|
|
|
+
|
|
|
|
|
+Требуется явное приведение:
|
|
|
|
|
+
|
|
|
|
|
+- `(как Пользователь x)` → с проверкой.
|
|
|
|
|
+- Или — `(проверить-по-схеме ...)`.
|
|
|
|
|
+
|
|
|
|
|
+Фиксируется событие:
|
|
|
|
|
+
|
|
|
|
|
+- В лог: `(шлюз открыт: внешний-API)` (по умолчанию активно).
|
|
|
|
|
+- В граф жизненного цикла — новая ветвь анализа.
|
|
|
|
|
+
|
|
|
|
|
+## Психологические и педагогические механизмы
|
|
|
|
|
+
|
|
|
|
|
+Для новичка:
|
|
|
|
|
+
|
|
|
|
|
+- Динамика отключена.
|
|
|
|
|
+- При попытке использовать — подсказка: "Динамические типы доступны после прохождения модуля 'Работа с внешними данными'".
|
|
|
|
|
+
|
|
|
|
|
+Для мастера:
|
|
|
|
|
+
|
|
|
|
|
+- Можно использовать динамический шлюз,
|
|
|
|
|
+- но только с обоснованием, и с автоматическим логированием всех операций (включено по умолчанию).
|
|
|
|
|
+
|
|
|
|
|
+Для системы:
|
|
|
|
|
+
|
|
|
|
|
+- Все динамические участки автоматически документируются.
|
|
|
|
|
+- Нет идеалистических типов данных (всегда присутствует байтовый поток).
|
|
|
|
|
+- При стабилизации — предлагает: "Этот шлюз использован 100 раз. Создать статический тип?" (возможна автоматическая генерация обратимого конвертера)
|
|
|
|
|
+
|
|
|
|
|
+## Пример: полный цикл перехода
|
|
|
|
|
+
|
|
|
|
|
+```lisp
|
|
|
|
|
+(// Внешний API — неизвестная структура)
|
|
|
|
|
+(фикс данные (= HTTP-запрос "https://api.partner/data"
|
|
|
|
|
+ @шлюз-вход))
|
|
|
|
|
+
|
|
|
|
|
+(// Проверка и переход к статике)
|
|
|
|
|
+(если (анализ данные как АнализДанных)
|
|
|
|
|
+ тогда (отправить-в-отчёт (как АнализДанных данные))
|
|
|
|
|
+ иначе (лог-ошибка "некорректные данные")))
|
|
|
|
|
+
|
|
|
|
|
+(// Определение типа на основе практики)
|
|
|
|
|
+(структ АнализДанных
|
|
|
|
|
+ @показатель: дробное
|
|
|
|
|
+ @дата: временная-метка
|
|
|
|
|
+ @регион: перечисление (Москва Питер Владивосток)
|
|
|
|
|
+ @док: "Анализ данных по регионам с привязкой по времени")
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+От хаоса внешнего мира → к порядку внутренней системы через безопасные однонаправленные шлюзы.
|
|
|
|
|
+
|
|
|
|
|
+## Заключение: типизация как диалектический процесс
|
|
|
|
|
+
|
|
|
|
|
+Предлагаемое решение не устраняет противоречие, а развивает отношения внутренних форм в конкретной ситуации:
|
|
|
|
|
+
|
|
|
|
|
+- Статика — не догма, а результат победы над хаосом.
|
|
|
|
|
+- Динамика — не свобода, а временное отступление перед объективной необходимостью, но без отрыва от реальности.
|
|
|
|
|
+- Переход — не скачок, а контролируемый, документируемый, педагогически организованный процесс.
|
|
|
|
|
+- Язык — не набор правил, а механизм познания реальности через типы.
|
|
|
|
|
+
|
|
|
|
|
+Это — не просто типовая система, это — диалектика познания:
|
|
|
|
|
+
|
|
|
|
|
+от незнания → к гипотезе (динамика) → к истине (статика).
|