Как было отмечено ранее, синтаксис предлагаемый с опорой на Си / Rust не поддерживает (сопротивляется) развитию семантических форм языка. Слишком много форм представления алгоритмов и структур.
Более узкие семантические формы в духе S-выражений (ближе по сути к Лисп), позволяют создавать на единой базе S-выражений предсказуемые по форме выражения, но c широкой по содержанию семантикой.
Rust , как мы уже отметили, — это победа формы над мыслью в угоду безопасности.
Lisp — победа мысли над формой, но в ущерб практике и педагогике.
Pascal -- при хороших педагогических свойствах не обеспечивает требование развития языка.
Нам же нужен синтез:
Lisp в синтаксисе,prolet как диалектический минимализмОсновной принцип:
Это — не возврат к Lisp , а его диалектическое преодоление:
но встраиваем их в рамки объективной реальности — памяти, времени, безопасности, единообразия, готовности программиста.
Вместо множества форм ( struct , enum , fn , unsafe , impl , where и т.д.) — одна базовая конструкция:
%контекст(...)
Но! Семантика определяется не формой, а контекстом и свойствами контекста.
Примеры: Функция (высокий уровень)
фн(
имя(Обработать)
парам(
Байты(нов данные)
)
нач(
Фильтровать(данные
(> 10)
(* 2)
)
)
)
Низкоуровневая операция
прц(
имя(ЦелПеремещ)
эффект(
система()
кварк()
)
парам(
КваркЦел(нов ист)
КваркЦел(нов цель +изм)
)
нач(
Загр(ист рег0)
Слож(рег1 рег0)
Сохр(рег1 цель)
)
)
прц(
имя(Копировать)
парам(
CисАдрес(нов ист)
СисАдрес(нов цель)
Дом(нов размер)
)
нач(
Цикл(
ЦелПеремещ(рез)
СисАдр(инк ист)
СисАдр(срав ист цель)
ЦиклСтоп(рез)
);
);
);
атом(
имя(Пользователь)
протон(
имя(ЧеловекНом)
тип(БЦел)
домен(1..БЦелМакс)
)
протон(
имя(ЧеловекИмя +изм)
тип(Стр)
домен(1..150)
)
протон(
имя(ЧеловекВозраст +изм)
тип(БЦел)
домен(0..120)
)
протон(
имя(Роль +изм)
тип(Стр)
домен(1..40)
)
)
Спецификация
спец(
имя(ИФайл)
прц(
имя(Читать)
парам(
ФайлИмя(нов имя)
)
вых(
РезБайты(нов рез)
)
док("Читает файл с указанным именем")
)
прц(
имя(писать)
парам(
ФайлИмя(нов имя)
Ос(.Права)(нов права)
)
вых(
ОптОш(нов рез +изм)
)
док("Записывает файл с указанным именем и правами")
)
)
Все конструкции — одного синтаксического вида, но семантика управляется контекстом в начале:
фн (функция),атом ,система (эффект, низкоуровневый),спец.Мы не устраняем сложность, но последовательно её раскрываем.
Доступны только:
прц(...)фн(...)протон(...)протон(...)словарь(...)список(...)если(...)цикл(...)Нет доступа к:
система() (эффект, низкоуровневый),кварк() (эффект, низкоуровневый),макро() (эффект, низкоуровневый, манипуляция AST).
прц(
имя(Приветствовать)
эффект(
терм_вых()
)
парам(
ГостьИмя(нов имя)
)
нач(
Печатать("Привет, {имя}!")
)
)
Простота Лиспа, но в безопасной оболочке диалектического языка.
Открываются:
атом(...)спец(...)
атом(
имя(Точка)
протон(
имя(ПозХ)
тип(Цел)
домен(-10_000..10_000)
)
протон(
имя(ПозУ)
тип(Цел)
домен(-10_000..10_000)
)
)
Язык начинает развиваться, но в рамках контролируемой системы.
Разрешён:
система (низкоуровневый эффект)кварк (низкоуровневый эффект)адр (работа на уровне ВМ)макро: ... (манипуляция AST)
макрос(
имя(когда)
парам(
тело(нов условие)
тело(нов кодДа)
тело(нов кодНет)
)
эффект(
квалификация(специалист)
тест()
)
док("Удобный макрос-обёртка над если")
нач(
если(условие
тогда(
тело(встав кодДа)
..()
)
)
тело(встав кодНет)
)
)
прц(
имя(КопироватьПамять)
эффект(
система()
кварк()
квалификация(специалист)
тест()
)
парам(
СисАдр(нов цель)
СисАдр(нов источник +изм)
СисКолич(нов длина)
)
нач(
Сохр(рег3 длина)
Цикл(
ЦельПеремещ(рег0)
СисАдр(инк источник)
СисАдр(срав источник длина)
ЦиклСтоп(рез)
СисАдр(инк цель)
)
)
)
Но! Такой код не компилируется без:
причина "взаимодействие с железом".СписЦел(нов 1 2 3)
атом(
имя(Пользователь)
протон(
имя(ЧелИмя)
тип(Стр)
домен(1..140)
)
протон(
имя(ЧелВозраст +изм)
тип(БЦел)
домен(0..120)
)
протон(
имя(Роль +изм)
тип(Стр)
домен(1..40)
)
)
спец(
имя(Проверятор)
прц(
имя(Пуск)
нач(
Пользователь(нов
имя("Анна")
возраст(28)
роль(Админ)
уст(<...>)
)
)
)
фн(
имя(ФайлПроверить)
парам(
СписБайт(нов нечто)
)
нач(
СписБайт(срав нечто.длина > 0)
если (рез
тогда (
Файл(записать нечто)
)
)
)
)
Это — диалектическая гибкость: форма одна, но смысл возникает в практике применения, а не в синтаксической избыточности.
Макросы — не анархия, а организованное развитие.
макрос(
имя(конкурент)
парам(
тело(нов код)
)
нач(
тело(встав код)
док("Запускает конкурентно тело выражения")
)
)
прц(
имя(Пуск)
нач(
конкурент(
ЗагрузитьДанные()
ОбновитьИнтерфейс()
)
)
)
Но:
если, фн и т.п.).Это — революционное преобразование старой формы со свободным содержанием, в новую форму с дисциплиной смысла.
Переход на низкий уровень — не синтаксическое волшебство, а сознательный акт:
фн(
имя(СложитьАдреса)
эффект(
система()
обоснование("оптимизация критического участка")
ревью()
квалификация(специалист)
)
парам(
СисАдр(нов a)
СисАдр(нов b)
)
нач(
РодИзвлечь(a)
РодИзвлечь(b)
Яблоко(слож a b)
)
)
Что даёт такая форма:
Lisp Очень низкаяRust Высокаяprolet НизкаяLisp Низкая (всё — список)Rust Высокая (много форм)prolet Высокая (контекст + действие)Lisp Деструктивно высокаяRust Ограниченнаяprolet Высокая (макросы + уровни)Lisp НетRust Высокаяprolet (по уровням, от минимальной до высокой)Lisp доступно индивидуальноRust Через RFCprolet Через макросы + одобрение сверхуLisp Высокая для экспертов, низкая для новичковRust Низкая (много правил)prolet Высокая для всех (одна форма; много разных смыслов в разных контекстах)Lisp НизкаяRust Недостаточнаяprolet Высокая (постепенное раскрытие)Приведённый синтез формы из трёх языков, соответствует духу диалектического материализма:
Это — не упрощение, а углубление диалектики: