Kaynağa Gözat

SVI Добавления

SVI 6 ay önce
ebeveyn
işleme
a8f6d093e7
2 değiştirilmiş dosya ile 288 ekleme ve 0 silme
  1. 1 0
      README.md
  2. 287 0
      docs/prolet-dialect-typing.md

+ 1 - 0
README.md

@@ -12,6 +12,7 @@
 - [Диалектика стиля нотации](./docs/prolet-notation-style.md)
 - [Диалектическое развитие S-выражений](./docs/prolet-lisp-up.md)
 - [Диалектика развития языка](./docs/prolet-dialect-up.md)
+- [Диалектика динамики типов](./docs/prolet-dialect-typing.md)
 - Атомы языка
 - ВМ
 - Система типов

+ 287 - 0
docs/prolet-dialect-typing.md

@@ -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"
+                @шлюз-вход))
+
+(// Проверка и переход к статике)
+(если (анализ данные как АнализДанных)
+    тогда (отправить-в-отчёт (как АнализДанных данные))
+    иначе (лог-ошибка "некорректные данные")))
+
+(// Определение типа на основе практики)
+(структ АнализДанных
+  @показатель: дробное
+  @дата: временная-метка
+  @регион: перечисление (Москва Питер Владивосток)
+  @док: "Анализ данных по регионам с привязкой по времени")
+```
+
+От хаоса внешнего мира → к порядку внутренней системы через безопасные однонаправленные шлюзы.
+
+## Заключение: типизация как диалектический процесс
+
+Предлагаемое решение не устраняет противоречие, а развивает отношения внутренних форм в конкретной ситуации:
+
+- Статика — не догма, а результат победы над хаосом.
+- Динамика — не свобода, а временное отступление перед объективной необходимостью, но без отрыва от реальности.
+- Переход — не скачок, а контролируемый, документируемый, педагогически организованный процесс.
+- Язык — не набор правил, а механизм познания реальности через типы.
+
+Это — не просто типовая система, это — диалектика познания:
+
+от незнания → к гипотезе (динамика) → к истине (статика).