01_90.md 12 KB

pro-009 Диалектическая несостоятельность nil

Очередное диалектическое противоречие для рассмотрения сущее - не сущее. Ошибка на миллиард долларов в нашем новом, диалектическо-материалистическом языке недопустима. Наша модель языка должна отражать реально существующий мир.

Рассмотрим корень диалектического материализма, его онтологическую основу:

  • Сущее vs не сущее,
  • Бытие vs Небытие,
  • Материя vs Пустота,
  • Наличие vs Отсутствие.

Это не просто «обработка nil» — это фундаментальное противоречие, лежащее в основе всего сущего. И если мы хотим построить язык, который отражает реально существующий мир, а не идеальный мир платоновских форм, то мы обязаны решить это противоречие диалектически, а не технически, или прагматически, или сугубо субъективно.

Философская основа: "сущее и не сущее" в диалектическом материализме

Материя первична — сущее есть

В диалектическом материализме только объективно существующееесть.

Всё остальное — отражение, потенциальность, но не бытие.

Сущее — это то, что взаимодействует с миром, что занимает место в пространстве-времени, что оказывает воздействие.

Не сущее — это отсутствие материи, небытие, ничто.

Но! Диалектика учит: ничто не возникает из ничего, и ничто не исчезает в ничто.

Следовательно, не сущее — не абстракция, а момент развития материи вне установленных философских категорий -- нечто.

Противоречие в программировании: null, undefined, None, nil

В большинстве языков: nil — это "значение, которое не есть значение".

Это — онтологическая ошибка: признание существования небытия как равноправного с бытием.

Пример катастрофы:

// может быть null
String name = user.getName();

// NullPointerException — ошибка на миллиард долларов
int len = name.length();     

Это — не ошибка программиста, это — ошибка онтологии языка, который допускает, что не сущее может передаваться как сущее.

Идеалистические ошибки в типизации "сущее/не сущее"

C/C++

NULL — указатель в никуда

Допускает использование "ничего" как "чего-то"

Java/Python

null/None — объект-пустота

Придаёт небытию форму бытия

Haskell

Maybe a — чисто, но абстрактно

Отделяет форму от материи

Rust

Option<T> — шаг вперёд, но не до конца

None — всё ещё "значение", хотя и обёрнуто

Все они — идеалистические компромиссы:

  • признают небытие как форму бытия,
  • вместо того, чтобы разрешить противоречие через практику.

Диалектическое решение: "сущее" и "нечто" как реально существующие противоположности в движении

Принципы онтологии языка prolet:

  • Только сущее может быть значением.
  • Если чего-то нет — оно не может быть передано, не может быть переменной, не может быть в вычислении.
  • нечто — не значение, а реально существующее состояние процесса.
  • Оно не существует само по себе, а возникает в практике получения сущего без формы.
  • Переход от нечто к сущему — через труд, проверку, практику.
  • Как в жизни: хлеб не берётся из воздуха — он выращивается, обрабатывается, доставляется.
  • Язык не допускает "пустоту" как объект — он требует решения.

Нет null. Нет None. Есть нечто как сущее, но неопределённое.

📔 Механизм: нечто — тип, как пространство поиска сущего

Вместо Option<T> или null — вводим сущность нечто, которая является типом, обозначает пространство неопределённости, в котором ещё не решено, есть ли сущее. Но сама содержащая неопределённость сущность нечто -- существует всегда.

(// 1. Внешний источник — может не дать сущего,
если шлюз принимает данные не от prolet-процесса)
(прц ЗапросИзАпи @шлюз_вход(): нечто
    ...)
)

(// Внутри `нечто` — нельзя использовать напрямую,
		ОШИБКА КОМПИЛЯЦИИ )
(ОбработатьДанные)
(уст нечто)

(// Переход к сущему — только через практику)
(ЕслиНечто нечто как Пользователь
		(// нечто — теперь сущее)
    тогда (
		(Привести нечто к Пользователь))
		(Пользователь Обработать)
		(// нет сущего — альтернатива)
    иначе (Пользователь ПоУмолчанию)) 

Ключевые особенности:

  • нечто — тип для определения пространства возможного.
  • Переменная нечто имеет значение до проверки, но не имеет определённого типа
  • После контекста ЕслиНечто — в ветке тогда переменная становится сущей.
  • В ветке иначе — альтернативное действие.

Это — единство бытия и небытия в процессе познания:

  • пока не проверили — нечто, а не сущее,
  • после проверки — сущее возникает как результат практики.

Онтологическая строгость: никакого "значения-пустоты"

Сравните:

❎ Небытие-значение (ошибка)

String s = null;

⚠️ Небытие — обёрнуто, но существует (потенциальная ошибка)

let s: Option<String> = None;

✔️ Нечто — не значение, а состояние поиска

(прц ИзПорта @шлюз_вход (...): нечто
	(...)
)

В prolet нельзя написать:

(Пусто)(уст дыра @мут) (// ОШИБКА: "ничего" не есть)

Потому что ничего не есть.

Практическая реализация: три формы работы с не сущим

Форма 1: Проверка (познание через практику)

(НайтиПоНомеру (123 125)(уст нечто)

(ЕслиНечто нечто как Пользователь
    тогда (
		(Привести нечто к Пользователь)
		(уст пользователь)
        (напечатать "Здравствуй, " пользователь имя))
    иначе (напечатать "Пользователь не найден"))

Только после проверки — пользователь становится сущим.

Форма 2: Принудительное извлечение (с ответственностью)

(фн ПрочитатьФайл @шлюз_вход() -> нечто)

(ГарантНечто нечто как Пользователь
    @_док "данные обязательны, иначе сбой конфигурации"
    иначе (
		(Пользователь Новый)
		(уст пользователь))
))

Гарантировать — не отрицание онтологии, а утверждение сущего на основе практики.

Но требует введения небытия и работает только в контролируемых условиях.

Педагогический и психологический аспект

  • Новичок не может использовать нечто без ЕслиНечто.
  • ГарантНечто вернёт сущее.

IDE подсвечивает:

  • "Переменная нечто — не содержит конкретной формы. Проверьте перед использованием."
  • При попытке передать нечто в функцию, ожидающую сущее — ошибка компиляции.

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

Философское обобщение: онтология языка

Бытие

  • Только то, что существует, имеет форму, действует
  • Переход от нечто к сущему через проверку

Небытие

  • Не может иметь форму
  • Нет возможности перехода к сущему, и даже к нечто

Ошибка онтологии

::: info Не использование nil, а признания небытия как невозможное в реальном мире. Язык не допускает онтологической лжи.

:::

Он требует:

  • Либо — сущее,
  • Либо — честное признание, что его ещё нет,
  • Либо — создание альтернативного сущего.

Заключение: язык как отражение реального мира

Дано решение главного противоречия:

prolet не допускает ошибки на миллиард долларов, потому что он не допускает лжи онтологии.

  • В нём нет места nil, потому что ничего не есть.
  • В нём есть место практике, потому что сущее рождается в труде.
  • В нём есть место неопределённости, но не как значению, а как пространству поиска.
  • В нём программист — не маг, а труженик, добывающий сущее из потенциально сущего.

::: success Это — не просто безопасность, это — материалистическая честность, это — диалектика бытия, воплощённая в синтаксисе.

:::