В духе диалектического материализма, прототип предложенного решения оснастим ещё большей выразительностью. А именно: рассмотрим вариант синтаксиса, где базовая часть ядра языка заметно (но ненавязчиво) отличается от той части, что предлагает программист в виде своего кода. Чтобы снять противоречие старого и нового, неподвижного (и малоподвижного) от движущегося.
Необходимо выполнить не просто синтез противоположностей, а разделение старого и нового на уровне внутренней семантики формы, чтобы сама структура языка отражала закон отрицания отрицания.
Если язык претендует на диалектичность, он не может быть полностью единообразным в любой форме. Он должен материально выражать противоречие между устоявшимся и возникающим, между ядром-основой и творческим дополнением, между материей прошлого и сознанием будущего.
поднимая язык на новый уровень.
Это — не просто метапрограммирование,
это — организация языка как классовой борьбы между консервацией прошлого и революцией настоящего в сфере сознания.
Два слоя синтаксиса:
Это — единство и борьба форм, где форма выражает содержание диалектики.
Основано на S-выражениях, как в Лиспе, но семантически строго:
(фн сложить (a b)
(+ a b))
(структ Пользователь
@имя: Строка
@возраст: Целое)
(если (x > 0)
тогда (напечатать "Положительно")
иначе (напечатать "Ноль или отрицательно"))
Особенности ядра:
Это — материальная база, как производительные силы в экономике — нельзя менять каждый день, но можно развивать в следующей версии, с развитием производственных отношений.
Работает в таких же круглых скобках, где сопровождающий атрибут @макро означает расширение, развитие, отрицание старого на уровне пользователя. Расширение способно заменить в текущей программе более высокоуровневые реализации.
Внутри — новые формы, DSL, макросы, оптимизации. Снаружи -- прежний синтаксис.
(@макро параллельно
(загрузить-данные)
(обновить-интерфейс)
)
(@макро SQL "SELECT * FROM пользователи WHERE возраст > ?" возраст }
Как это работает: параллельно — не ключевое слово, а расширение, определённое в пользовательской библиотеке, на том же уровне.
Это — народное творчество, как массовое движение, которое не ломает основу, но вносит новое содержание.
(операция аргументы)(@макро содержание)Это — диалектическое разделение труда в языке:
Пример: появление нового цикла в потоках (старое ядро):
(для задача в список-задач
(выполнить задача))
После проверки практикой — включение в ядро новой версии (расширение): Новое (расширение):
(в-потоках список-задач)
Это — отрицание отрицания:
(для ... создать-поток) — отрицается,(в-потоках ...) — отрицает старое,Но затем (в-потоках ...) само отрицается — становится частью ядра, и появляется новое расширение для асинхронных потоков.
Для новичка:
(...) — простота, порядок, безопасность.Для мастера:
(@макро ...), на пользовательском уровне, но осознаёт, что это — эксперимент, что он выходит за рамки устоявшегося, что за это несёт ответственность. При компиляции получает уведомление (если не подавлено атрибутом)Расширения разработчиками ядра могут быть:
Это — демократический централизм в действии.
Этап 1: Парсинг ядра
Этап 2: Макро-раскрытие расширений на уровне пользователя
(@макро ...), подставляет определение из зарегистрированных расширений.Этап 3: Трансляция в ядро
Этап 4: Компиляция
Таким образом, вся сложность остаётся контролируемой, сборка занимает незначительное время, а инновации не разрушают стабильность.
(// === ЯДРО === )
(фн обработать-пакет (пакет)
(если (проверить-целостность пакет)
тогда (расшифровать пакет)
иначе (ошибка "битый пакет")))
(// === РАСШИРЕНИЕ === )
(HTTP-сервер
@маршрут: ("/api/данные" обработать-пакет)
@порт: 8080
)
(лог "Запуск сервера...")
Здесь:
( ) — отражает устоявшееся, необходимое, объективное.(@макро ...) — отражает возникающее, творческое, субъективное.Их борьба и единство — двигатель развития.
Переход расширения в ядро — качественный скачок.
Разделение форм — материальное выражение закона отрицания отрицания.
Это — не просто язык программирования, это — модель социалистического информационного общества: