|
|
@@ -39,8 +39,8 @@
|
|
|
|
|
|
Вместо множества форм ( `struct` , `enum` , `fn` , `unsafe` , `impl` , `where` и т.д.) — одна базовая конструкция:
|
|
|
|
|
|
-```yml
|
|
|
-%контекст: ...
|
|
|
+```pyton
|
|
|
+%контекст(...)
|
|
|
```
|
|
|
|
|
|
**Но!** Семантика определяется *не формой*, а *контекстом* и *свойствами контекста*.
|
|
|
@@ -48,72 +48,106 @@
|
|
|
Примеры:
|
|
|
Функция (высокий уровень)
|
|
|
|
|
|
-```yml
|
|
|
-фн:
|
|
|
- имя: Обработать
|
|
|
- парам:
|
|
|
- - Байты данные
|
|
|
- нач:
|
|
|
- - Фильтровать данные (> 10) (* 2)
|
|
|
+```python
|
|
|
+фн(
|
|
|
+ имя(Обработать)
|
|
|
+ парам(
|
|
|
+ Байты(нов данные)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ Фильтровать(данные
|
|
|
+ (> 10)
|
|
|
+ (* 2)
|
|
|
+ )
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
```
|
|
|
|
|
|
Низкоуровневая операция
|
|
|
|
|
|
-```yml
|
|
|
-прц:
|
|
|
- имя: ЦелПеремещ
|
|
|
- эффект:
|
|
|
- - система
|
|
|
- - кварк
|
|
|
- парам:
|
|
|
- - КваркЦел ист цель +изм
|
|
|
- нач:
|
|
|
- - Загр ист рег0
|
|
|
- - Слож рег1 рег0
|
|
|
- - Сохр рег1 цель
|
|
|
-
|
|
|
-прц:
|
|
|
- имя: Копировать
|
|
|
- парам:
|
|
|
- - CисАдрес ист цель
|
|
|
- - Дом размер
|
|
|
- нач:
|
|
|
- - Цикл ист до цель ЦелПеремещ рез
|
|
|
+```python
|
|
|
+прц(
|
|
|
+ имя(ЦелПеремещ)
|
|
|
+ эффект(
|
|
|
+ система()
|
|
|
+ кварк()
|
|
|
+ )
|
|
|
+
|
|
|
+ парам(
|
|
|
+ КваркЦел(нов ист)
|
|
|
+ КваркЦел(нов цель +изм)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ Загр(ист рег0)
|
|
|
+ Слож(рег1 рег0)
|
|
|
+ Сохр(рег1 цель)
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+прц(
|
|
|
+ имя(Копировать)
|
|
|
+ парам(
|
|
|
+ CисАдрес(нов ист)
|
|
|
+ СисАдрес(нов цель)
|
|
|
+ Дом(нов размер)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ Цикл(
|
|
|
+ ЦелПеремещ(рез)
|
|
|
+ СисАдр(инк ист)
|
|
|
+ СисАдр(срав ист цель)
|
|
|
+ ЦиклСтоп(рез)
|
|
|
+ );
|
|
|
+ );
|
|
|
+);
|
|
|
+
|
|
|
```
|
|
|
|
|
|
### Атомы
|
|
|
|
|
|
-```yml
|
|
|
-атом:
|
|
|
- имя: Пользователь
|
|
|
- протон:
|
|
|
- - ЧеловекНом номер
|
|
|
- - ЧеловекИмя имя +изм
|
|
|
- - ЧеловекВозраст возраст +изм
|
|
|
- - Роль роль +изм
|
|
|
+```python
|
|
|
+атом(
|
|
|
+ имя(Пользователь)
|
|
|
+ протон(
|
|
|
+ ЧеловекНом(нов номер)
|
|
|
+ ЧеловекИмя(нов имя +изм)
|
|
|
+ ЧеловекВозраст(нов возраст +изм)
|
|
|
+ Роль(нов роль +изм)
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
```
|
|
|
|
|
|
Спецификация
|
|
|
|
|
|
-```yml
|
|
|
-спец:
|
|
|
- имя: ИФайл
|
|
|
- действ:
|
|
|
- Читать:
|
|
|
- тип: прц
|
|
|
- парам:
|
|
|
- - ФайлИмя имя
|
|
|
- вых:
|
|
|
- - РезБайты
|
|
|
- док: "Читает файл с указанным именем"
|
|
|
- Писать:
|
|
|
- тип: прц
|
|
|
- парам:
|
|
|
- - ФайлИмя имя
|
|
|
- - Ос.Права права
|
|
|
- вых:
|
|
|
- - ОптОш +изм
|
|
|
- док: "Записывает файл с указанным именем и правами"
|
|
|
+```python
|
|
|
+спец(
|
|
|
+ имя(ИФайл)
|
|
|
+ прц(
|
|
|
+ имя(Читать)
|
|
|
+ парам(
|
|
|
+ ФайлИмя(нов имя)
|
|
|
+ )
|
|
|
+ вых(
|
|
|
+ РезБайты(нов рез)
|
|
|
+ )
|
|
|
+ док("Читает файл с указанным именем")
|
|
|
+ )
|
|
|
+ прц(
|
|
|
+ имя(писать)
|
|
|
+ парам(
|
|
|
+ ФайлИмя(нов имя)
|
|
|
+ Ос(.Права)(нов права)
|
|
|
+ )
|
|
|
+ вых(
|
|
|
+ ОптОш(нов рез +изм)
|
|
|
+ )
|
|
|
+ док("Записывает файл с указанным именем и правами")
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
```
|
|
|
|
|
|
Все конструкции — одного синтаксического вида, но семантика управляется *контекстом в начале*:
|
|
|
@@ -131,30 +165,34 @@
|
|
|
|
|
|
Доступны только:
|
|
|
|
|
|
-* прц: ...,
|
|
|
-* фн: ...,
|
|
|
-* протон: ...,
|
|
|
-* протон: ...,
|
|
|
-* словарь: ...,
|
|
|
-* список: ...,
|
|
|
-* если ...,
|
|
|
-* цикл ...
|
|
|
+* `прц(...)`
|
|
|
+* `фн(...)`
|
|
|
+* `протон(...)`
|
|
|
+* `протон(...)`
|
|
|
+* `словарь(...)`
|
|
|
+* `список(...)`
|
|
|
+* `если(...)`
|
|
|
+* `цикл(...)`
|
|
|
|
|
|
Нет доступа к:
|
|
|
|
|
|
-* `система` (эффект, низкоуровневый),
|
|
|
-* `кварк` (эффект, низкоуровневый),
|
|
|
-* `макро` (эффект, низкоуровневый, манипуляция AST).
|
|
|
-
|
|
|
-```yml
|
|
|
-прц:
|
|
|
- имя: Приветствовать
|
|
|
- эффект:
|
|
|
- - терм_вых
|
|
|
- парам:
|
|
|
- - ГостьИмя имя
|
|
|
- нач:
|
|
|
- - Печатать "Привет, " имя "!"
|
|
|
+* `система()` (эффект, низкоуровневый),
|
|
|
+* `кварк()` (эффект, низкоуровневый),
|
|
|
+* `макро()` (эффект, низкоуровневый, манипуляция AST).
|
|
|
+
|
|
|
+```python
|
|
|
+прц(
|
|
|
+ имя(Приветствовать)
|
|
|
+ эффект(
|
|
|
+ терм_вых()
|
|
|
+ )
|
|
|
+ парам(
|
|
|
+ ГостьИмя(нов имя)
|
|
|
+ );
|
|
|
+ нач(
|
|
|
+ Печатать("Привет, {имя}!")
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
Простота **Лиспа**, но в безопасной оболочке диалектического языка.
|
|
|
@@ -163,15 +201,19 @@
|
|
|
|
|
|
Открываются:
|
|
|
|
|
|
-* атом: ...,
|
|
|
-* спец: ...,
|
|
|
+* `атом(...)`
|
|
|
+* `спец(...)`
|
|
|
|
|
|
```yml
|
|
|
-атом:
|
|
|
- имя: Точка
|
|
|
- протон:
|
|
|
- - ПозX х
|
|
|
- - ПозУ у
|
|
|
+атом(
|
|
|
+ имя(Точка)
|
|
|
+ протон(
|
|
|
+ имя(ПозХ)
|
|
|
+ )
|
|
|
+ протон(
|
|
|
+ имя(ПозУ)
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
Язык начинает развиваться, но в рамках контролируемой системы.
|
|
|
@@ -186,35 +228,55 @@
|
|
|
* `адр` (работа на уровне ВМ)
|
|
|
* макро: ... (манипуляция AST)
|
|
|
|
|
|
-```yml
|
|
|
-макрос:
|
|
|
- имя: когда
|
|
|
- парам:
|
|
|
- - тело условие
|
|
|
- - тело кодДа
|
|
|
- - тело кодНет
|
|
|
- эффект:
|
|
|
- - квалификация специалист
|
|
|
- - тест
|
|
|
- док: "Удобный макрос-обёртка над если"
|
|
|
- нач:
|
|
|
- - если условие
|
|
|
- - _ тогда {кодДа}
|
|
|
- - _ иначе {кодНет}
|
|
|
-
|
|
|
-прц:
|
|
|
- имя: КопироватьПамять
|
|
|
- эффект:
|
|
|
- - система
|
|
|
- - кварк
|
|
|
- - квалификация специалист
|
|
|
- - тест
|
|
|
- парам:
|
|
|
- - СисАдр цель источник +изм
|
|
|
- - СисКолич длина
|
|
|
- нач:
|
|
|
- - Сохр рег3 длина
|
|
|
- - Цикл рег0 до рег2 ЦельПеремещ рег0
|
|
|
+```python
|
|
|
+макрос(
|
|
|
+ имя(когда)
|
|
|
+ парам(
|
|
|
+ тело(нов условие)
|
|
|
+ тело(нов кодДа)
|
|
|
+ тело(нов кодНет)
|
|
|
+ )
|
|
|
+ эффект(
|
|
|
+ квалификация(специалист)
|
|
|
+ тест()
|
|
|
+ )
|
|
|
+ док("Удобный макрос-обёртка над если")
|
|
|
+ нач(
|
|
|
+ если(условие
|
|
|
+ тогда(
|
|
|
+ тело(встав кодДа)
|
|
|
+ ..()
|
|
|
+ )
|
|
|
+ )
|
|
|
+ тело(встав кодНет)
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+прц(
|
|
|
+ имя(КопироватьПамять)
|
|
|
+ эффект(
|
|
|
+ система()
|
|
|
+ кварк()
|
|
|
+ квалификация(специалист)
|
|
|
+ тест()
|
|
|
+ )
|
|
|
+ парам(
|
|
|
+ СисАдр(нов цель)
|
|
|
+ СисАдр(нов источник +изм)
|
|
|
+ СисКолич(нов длина)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ Сохр(рег3 длина)
|
|
|
+ Цикл(
|
|
|
+ ЦельПеремещ(рег0)
|
|
|
+ СисАдр(инк источник)
|
|
|
+ СисАдр(срав источник длина)
|
|
|
+ ЦиклСтоп(рез)
|
|
|
+ СисАдр(инк цель)
|
|
|
+ )
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
**Но!** Такой код не компилируется без:
|
|
|
@@ -225,31 +287,51 @@
|
|
|
|
|
|
## Семантическая экономия: один синтаксис — разный смысл по контексту
|
|
|
|
|
|
-```yml
|
|
|
-спис: Цел 1 2 3
|
|
|
-атом:
|
|
|
- имя: Пользователь
|
|
|
- протон:
|
|
|
- - ЧелИмя имя
|
|
|
- - ЧелВозраст возраст +изм
|
|
|
- - Роль роль +изм
|
|
|
-спец:
|
|
|
- имя: Проверятор
|
|
|
-прц:
|
|
|
- имя: Пуск
|
|
|
- нач:
|
|
|
- - ПользовательНов
|
|
|
- - _ имя "Анна"
|
|
|
- - _ возраст 28
|
|
|
- - _ роль Админ
|
|
|
- - уст ...
|
|
|
-фн:
|
|
|
- имя: ФайлПроверить
|
|
|
- парам:
|
|
|
- - СписБайт нечто
|
|
|
- нач:
|
|
|
- - нечто .длина > 0
|
|
|
- - если рез Файл записать нечто
|
|
|
+```python
|
|
|
+СписЦел(нов 1 2 3)
|
|
|
+атом(
|
|
|
+ имя(Пользователь)
|
|
|
+ протон(
|
|
|
+ имя(ЧелИмя)
|
|
|
+ тип(Стр)
|
|
|
+ )
|
|
|
+ протон(
|
|
|
+ имя(ЧелВозраст +изм)
|
|
|
+ тип(Цел)
|
|
|
+ )
|
|
|
+ протон(
|
|
|
+ имя(Роль +изм)
|
|
|
+ тип(Стр)
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+спец(
|
|
|
+ имя(Проверятор)
|
|
|
+ прц(
|
|
|
+ имя(Пуск)
|
|
|
+ нач(
|
|
|
+ Пользователь(нов
|
|
|
+ имя("Анна")
|
|
|
+ возраст(28)
|
|
|
+ роль(Админ)
|
|
|
+ уст(<...>)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ фн(
|
|
|
+ имя(ФайлПроверить)
|
|
|
+ парам(
|
|
|
+ СписБайт(нов нечто)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ СписБайт(срав нечто(.длина) > 0)
|
|
|
+ если (рез
|
|
|
+ тогда (
|
|
|
+ Файл(записать нечто)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
Это — диалектическая гибкость: форма одна, но смысл возникает в практике применения, а не в синтаксической избыточности.
|
|
|
@@ -258,19 +340,28 @@
|
|
|
|
|
|
Макросы — не анархия, а организованное развитие.
|
|
|
|
|
|
-```yml
|
|
|
-макрос:
|
|
|
- имя: конкурент
|
|
|
- парам:
|
|
|
- - тело код
|
|
|
- нач:
|
|
|
- - поток {код}
|
|
|
- - док: "Запускает конкурентно тело выражения"
|
|
|
-
|
|
|
-прц:
|
|
|
- имя: Пуск
|
|
|
- нач:
|
|
|
- - конкурент ЗагрузитьДанные ОбновитьИнтерфейс
|
|
|
+```python
|
|
|
+макрос(
|
|
|
+ имя(конкурент)
|
|
|
+ парам(
|
|
|
+ тело(нов код)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ тело(встав код)
|
|
|
+ док("Запускает конкурентно тело выражения")
|
|
|
+ )
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+прц(
|
|
|
+ имя(Пуск)
|
|
|
+ нач(
|
|
|
+ конкурент(
|
|
|
+ ЗагрузитьДанные()
|
|
|
+ ОбновитьИнтерфейс()
|
|
|
+ )
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
Но:
|
|
|
@@ -285,20 +376,26 @@
|
|
|
|
|
|
Переход на низкий уровень — не синтаксическое волшебство, а сознательный акт:
|
|
|
|
|
|
-```yml
|
|
|
-фн:
|
|
|
- имя: СложитьАдреса
|
|
|
- эффект:
|
|
|
- - система
|
|
|
- - обоснование "оптимизация критического участка"
|
|
|
- - ревью
|
|
|
- - квалификация специалист
|
|
|
- парам:
|
|
|
- - СисАдр a b
|
|
|
- нач:
|
|
|
- - РодИзвлечь a
|
|
|
- - РодИзвлечь b
|
|
|
- - Яблоко сложить a b
|
|
|
+```python
|
|
|
+фн(
|
|
|
+ имя(СложитьАдреса)
|
|
|
+ эффект(
|
|
|
+ система()
|
|
|
+ обоснование("оптимизация критического участка")
|
|
|
+ ревью()
|
|
|
+ квалификация(специалист)
|
|
|
+ )
|
|
|
+
|
|
|
+ парам(
|
|
|
+ СисАдр(нов a)
|
|
|
+ СисАдр(нов b)
|
|
|
+ )
|
|
|
+ нач(
|
|
|
+ РодИзвлечь(a)
|
|
|
+ РодИзвлечь(b)
|
|
|
+ Яблоко(слож a b)
|
|
|
+ )
|
|
|
+)
|
|
|
```
|
|
|
|
|
|
Что даёт такая форма:
|