Очередное диалектическое противоречие для рассмотрения сущее - не сущее. Ошибка на миллиард долларов в нашем новом, диалектическо-материалистическом языке недопустима. Наша модель языка должна отражать реально существующий мир.
Рассмотрим корень диалектического материализма, его онтологическую основу:
Это не просто «обработка nil» — это фундаментальное противоречие, лежащее в основе всего сущего. И если мы хотим построить язык, который отражает реально существующий мир, а не идеальный мир платоновских форм, то мы обязаны решить это противоречие диалектически, а не технически, или прагматически, или сугубо субъективно.
В диалектическом материализме только объективно существующее — есть.
Всё остальное — отражение, потенциальность, но не бытие.
Сущее — это то, что взаимодействует с миром, что занимает место в пространстве-времени, что оказывает воздействие.
Не сущее — это отсутствие материи, небытие, ничто.
Но! Диалектика учит: ничто не возникает из ничего, и ничто не исчезает в ничто.
Следовательно, не сущее — не абстракция, а момент развития материи.
В большинстве языков: null — это "значение, которое не есть значение".
Это — онтологическая ошибка: признание существования небытия как равноправного с бытием.
Пример катастрофы:
String name = user.getName(); // может быть null
int len = name.length(); // NullPointerException — ошибка на миллиард долларов
Это — не ошибка программиста, это — ошибка онтологии языка, который допускает, что "не-сущее" может передаваться как "сущее".
NULL — указатель в никуда
Допускает использование "ничего" как "чего-то"
null/None — объект-пустота
Придаёт небытию форму бытия
Maybe a — чисто, но абстрактно
Отделяет форму от материи
Option<T> — шаг вперёд, но не до конца
None — всё ещё "значение", хотя и обёрнуто
Все они — идеалистические компромиссы:
Принципы онтологии языка prolet:
Нет null. Нет None. Есть альтернатива или сущее.
Вместо Option<T> или null — вводим оператор возможно, который не является типом, а обозначает зону неопределённости, в которой ещё не решено, есть ли сущее. Но сама содержащая неопределённость сущность -- всегда существует
(// 1. Внешний источник — может не дать сущего,
если шлюз принимает данные не от prolet-процесса)
(прц ЗапросИзАпи @шлюз_вход @возможно () -> данные
...)
(// Внутри `возможно` — нельзя использовать напрямую,
ОШИБКА КОМПИЛЯЦИИ )
(ОбработатьДанные)
(// Переход к сущему — только через практику)
(ЕслиПробаИз данные как Пользователь
тогда (Обработать (ПривестиИз данные к Пользователь)) (// данные — теперь сущее)
иначе (ВосстановитьПоУмолчанию)) (// нет сущего — альтернатива)
Ключевые особенности:
@возможно — не тип, а атрибут для определения пространства возможного.ЕслиПробаИз — в ветке тогда переменная становится сущей.иначе — альтернативное действие.Это — единство бытия и не-бытия в процессе познания:
Сравните:
String s = null;
Пустота — значение
let s: Option<String> = None;
Пустота — обёрнута, но существует
((прц ИзПорта @шлюз_вход @возможно) -> @фикс СбщСырое)
Пустота — не значение, а состояние поиска
В prolet нельзя написать:
((Уст Пусто) -> @фикс дыра) (// ОШИБКА: "ничего" не есть)
Потому что ничего не есть.
((НайтиПоНомеру (123 125)) -> данные)
(ЕслиПробаИз данные как Пользователь
тогда (напечатать "Здравствуй, " данные.Имя)
иначе (напечатать "Пользователь не найден"))
Только после проверки — пользователь становится сущим.
(фн ПрочитатьФайл @шлюз_вход @возможно () -> @фикс данные)
(ГарантВозможно данные как Пользователь
@_док "данные обязательны, ошибка конфигурации"
иначе ((ПользовательИзСтроки данные) -> @фикс пользователь)
Гарантировать — не отрицание онтологии, а утверждение сущего на основе практики.
Но требует введения небытия и работает только в контролируемых условиях.
@возможно без если-возможно.гарант-возможно вернёт сущее.IDE подсвечивает:
@возможно в функцию, ожидающую сущее — ошибка компиляции.Это — формирование диалектического сознания: программист учится не признавать пустоту как бытие, а искать сущее в практике.
Использование null, а не признания небытия как нечто сущее
Язык не допускает онтологической лжи.
Он требует:
Дано решение главное противоречие:
prolet не допускает ошибки на миллиард долларов, потому что он не допускает лжи онтологии.
null, потому что ничего не есть.Это — не просто безопасность, это — материалистическая честность, это — диалектика бытия, воплощённая в синтаксисе.