Функциональная Потоковая Машина. Единая структура данных и программм
Этой статьей начинается детализация концепций (проект) не фон-Неймановской модели сегодняшних ЭВМ, сформулированных в работе "Универсальная Функциональная Потоковая ЭВМ с параллельными вычислениями", определяемой здесь как раздел 1 (Введение). Эта модель ломает и принятые сегодня концепции алгоритмичеких языков, решая проблему создания универсальной цифровой ЭВМ с параллельными вычислениями. Автор (к.т.н. Патрикеев В.Л., ТФ 0642-937358) убежден, что вычислитель - робот (ЭВМ) не обязательно должен быть моделью нейронной сети человеческого мозга и его образа мышления. Потому предлагается простое решение, которое поначалу не просто понять в силу сложившихся традиций (пересмотр всего к 15.08-2013 г.).
Содержание
|
Ссылки на все разделы проекта:
1. Функциональная Потоковая Машина с параллельными вычислениями. Введение (http://tadviser.ru/a/121275)
2. Единая структура данных и программ (http://tadviser.ru/a/149691)
3. Функционирование ФПМ. Выражения языка програмирования
(http://tadviser.ru/a/149691)
4. Потоки и их обработка в структуре выражения
(http://tadviser.ru/a/150588)
5. Микропрограммирование функций
(http://tadviser.ru/a/153069)
6. Программа, как управляемый поток выражений
(http://tadviser.ru/a/153069)
7. Макроопределения пользовательских функций(http://tadviser.ru/a/157631)
2. Единая структура данных и программ
Для описания структуры данных, языка и машины используется метасимволика Бэкуса-Наура. Дополнительно в скобки >[]
заключается часть описания, которую можно опускать. В скобки {} включается повторяемая (итерация) часть описания.
Элементы структуры имеют свойства - последовательность символов, ограничиваемую с обеих сторон спецсимволом '%'.
Предваряющий (префикс) свойство спецсимвол '~' отрицает наличие соответствующего свойства
2.1 . Синтаксис и коды структуры
<Структура> ::= [<Атом>][<Слой>] %[.][,]% %.% %,% В отсутствие Атома или Слоя в структуре, соответственно, отсутствует свойство '.' или ',' <Слой> ::= (<Список элементов>) | [<Список элементов>] | {<Список элементов>} %,(% %,[% %,{% <Список элементов> ::= <Элемент>{,<Элемент>} <Элемент> ::= [<Имя-индекс>:]<Неопределенный> | [<Имя-индекс>:]<Структура> %#% <Неопределенный>::= [#] – символ '#' может опускаться между запятыми и скобками '(', '[', '{' и ‘:’. Свойство %#% эквивалентно %~.~,% <Имя-индекс> ::= <идентификатор>
Не обязательно задаваемое Имя-индекс элемента уникально в пределах слоя, куда элемент входит.
В отсутствие элемента он является неопределенным (свойство %#%), возможно, с именем-индексом.
Идентификатор состоит из латинских букв и цифр, причем первая из них обязательно буква. Атом это число, строка, дата, имя функции
и др. (п.2.3)
Пример: Свойства '%~.,%' описывают структуру с отсутствующим атомом (~.), но присутствующим слоем (,).
2.2. Коды элементов данных
2.2.1. Коды элементов структуры
Эти коды определяются также логически и призваны ввести чуть более углубленное представление о конструкции элементов данных при их обработке.
В определении кодов отсутствуют:
- Сопровождающие в потоках элементы данных их свойства, включая определенные в п.2.1 и определяемые далее (список свойств)
- имена-индексы элементов слоя, используемые для доступа к ним и физически в виде соответствующего списка указателей,
сопровождающего этот слой
Код слоя размещается в блоке (БП) динамически распределяемой памяти (ДРП), допускающим (БП) прямой доступ к коду любого его элемента по целочисленному индексу – порядковому номеру (0, 1, 2,…) в слое:
<Код элемента [слоя]> ::= <УКА[- Указатель БП с атомом]> <УКС[- Указатель БП с кодом слоя]>
Собственно наличие свойств '.' и ',' в списке свойств %.,% структуры определяется, соотвественно, наличием (определенностью)
ссылок УКА (УКА<>0) и УКС (УКС<>0). В случае элемента - Атома (%.~,%) УКС не определен (УКС=0).
В случае элемента слоя (%~.,%) УКА=0 и в случае элемента - Узла (%.,) определены УКА<>0 и УКС<>0.
В случае неопределенного элемента (#) УКА=0 и УКС=0.
Во всех случаях при УКС<>0 элемент в числе прочих сопровождает свойства %.(%, %.[% или %.{%
в зависимости от типа скобок (п.2.1) слоя, указываемого УКС. Рассматриваемые здесь ьи ниже свойства слоя,
как и свойства втома размещаются непосредственно в БП, указываемым сооветственно УКС или УКА и изменяются автоматически
только (!) при изменениитипа или содержимого слоя или атома в БП
2.2.2. Коды элементов потоков данных
Функции обрабатывают поступающие на их входы (от аргументов) элементы потоков со свойством '%;%' каждый или унарный (%~;%) –
единственный элемент следующем виде:
- R-значение (%@%) - копия элемента структуры (слоя), т.е. пара ссылок УКА и/или УКС (возможно, УКА=0 и УКС=0 -
неопределенный элемент)
- V-значение (%&) - пара: УКС и индекс: Имя-индекс или порядковый номер (0, 1, 2, …) R-значения (кода элемента) в слое (БП),
указываемом ссылкой УКС. В сущности, V-значение - ссылка на размещение R-значения в ДРП.
- Атом (\ эквивалентно %~&~@%), передаваемый с выхода аргумента (микро-ЭВМ) на вход функции (микро-ЭВМ)
непосредственно своим значением (более удобная для обработки копия БП) без использования единой ДРП ФПМ
Указанные (в скобках) соответствующие типам элементов потока свойства могут обрабатываться функциями и примитивами,
вместе с рассмотренными выше (п.2.2.1) и рассматриваемыми далее (п.2.3 и др.) свойствами элементов структуры и
потоков, определяемыми автоматически в БП по УКА и УКС R-значения. В случае V-значения используются УКА и/или УКС
R-значения, указываемого V-значением: V-значение наследует свойства (атома, слоя) R-значения, указываемого V-значением.
ndsp; V-значение исключает отмеченную в [2] неопределенность и неоднозначность абсолютного большинства языков программирования в
определении X в левой (куда записать) и правой (что сложить с 1) частях оператора присваивания:
X := X + 1
2.3 . А т о м ы
<атом>::= <Целое> | <Вещественное> | <Дата> | <Строка> | <Свойства> | %.9% %./% %.'% %."% /%.:%/ <Имя> |<формула[_Calc]> %.`%
Здесь и ниже в %…% приводятся описания типов (видов) атомов, к каждом из которых следующий за ‘%’ символ '.'
определяет атом, а следующий за ним спецсимвол - тип атома. Определяющие тип атома символы '+', '.',
''', ':', '`' и '/' синтаксически начинают представление атома, что упрощает запоминание их смысла
по свойству.
Внимание! Внутри формулы НЕ допускается использрвание обратного апострофа '`'
<Имя>::= <Имя-индекс> |<Имя функции> | <Имя настройки [функции] %.|% %._% <Имя функции>::= <Имя генератора потока> | <Имя обработчика потоков> %.*% %.$% <Имя>::= [<тип имени>]<идентификатор> В случае имени-индекса "тип имени" отсутствует, в других случаях он совпадает со вторым символом свойств (типом, п.2.4) атома: '!', '_', '$' и '*' <Имя настройки [функции]>::= <имя примитива настройки> | <имя параметра настройки>
Параметр настройки отличается тем, что в отличие от примитива настройки его не сопровождает слой (%,(%) из аргументов.
Примитив настройки имеет вид функции унарного примитва и не имеет выхода
.
Здесь имя-индекс задается явно как атом и необязательно совпадает с определением имени-индекса (п.2.1) некоторого элемента
того же или другого слоя.
.
Набор функций (%.*% и %.$%), примитивов и параметров настройки (%._%) функций ФПМ фиксирован вместе с их именами,
которые размещаются в статически определяемой памяти, позволяющей по их имени мгновенно вычислить ссылку УКА на это Имя.
Прочие имена определяются пользователем и, как и другие атомы, размещаются в БП ДРП.
‘Целое' и 'Вещественное’ определяются как int и float языка СИ <Свойства>::= %{[~][<свойство>]}% В атоме "Свойства" свойства элемента потока предшествуют свойствам атома и/или слоя, но могут и отсутствовать.
Часть свойств в виде спецсимволов (спецсимвол - свойство) мы определили выше, прочие определим позднее и
каждое из последующих определяется кроме спецсимволов цифрой или символом латиницы.
В любом случае предваряющий свойство спецсимвол '~' является отрицанием следующего за ним свойства и возможно следующих далее
уточняющих свойств. Если '~' предшествует символу '.' (атом) то он отрицает:
- вообще наличие атома, если справа от '.' не указываются дополнительные свойства атома
- наличие атома вообще или с указанными далее свойствами атома
Примечание: Аналогично действие '~' на свойство ',' (слой) и следующие далее уточняющие свойства слоя.
Здесь свойства задаются явно атомом (его значением) в отличие от свойств, сопровождающих элементы структуры и потоков,
включая содержащие атом <Свойства>. Перечень свойств в атоме <Свойства> может быть пустым.
‘Строка’ – по аналогии с Си заключается в кавычки и использует экран для отмены обычной трактовки спецсимволов
в синтаксисе структуры данных.
Формула _Calc – суть строка с последовательностью операторов (операций) калькулятора _Calc (р.5).
2.4. Свойства элементов данных
Здесь дополнительно укажем следующие свойства:
%.[<тип атома>]0%- Атом имеет 0-е значение типа: число 0 (типы '+' и '.'), пустая строка (тип '"') или пустое множество свойств (':'), включая отсутствие кода '~' %,[<тип слоя>]0% - указываемый УКС<>0 слой пуст (тип слоя: '(', '[' или '{') %,[<тип слоя>]~0% - указываемый УКС<>0 слой НЕ пуст (есть путь вниз по иерархии структуры) %.[+]2% - четность целочисленного атома. Свойство '2' определяет целое и потому свойство '9' (целое) может отсутствовать %.9~2% - нечетность целочисленного атома %.9+% - целое положительное %./+% - вещественное положительное %&0% - V-значение (%&) указывает первый элемент слоя по своему УКС (индекс 0) %&~0% - V-значение (свойство &) указывает НЕ первый элемент слоя %&@% - V-значение (свойство &) указывает на реально существующий элемент слоя %&~@% - V-значение (свойство &) НЕ указывает на реально существующий элемент слоя (V-значение некорректно) %&|% - V-значение (свойство &) содержит имя-индекс (свойство '|') указываемого им в слое элемента %&~|% - V-значение (свойство &) содержит целочисленный индекс указываемого им в слое элемента: отрицается (~) свойство '|' имя-индекса %.|1% или %."1% - атом имя-=индекс или строка начинаются с заглавной (большой) буквы
2.5 . Потоки данных и выражений
Говоря о потоках на входах и выходах функций, будем подразумевать фактическую реализацию потоков в СА (Структура Активаций)
аналогичной структуры из микропроцессоров , р.1).
Согласно п.2.2.2 поток состоит из атомов, R- и V-значений. Каждый элемент потока может обладать собственными свойствами,
отличными от свойств других элементов потока.
Поток индексов – суть поток из целочисленных атомов (%.9+") и/или имен-индексов (%.|%) и/или ссылок УКА (R-значения) на такие атомы.
При необходимости использования функцией атома из R-значения по УКА автоматически извлекается атом.
При обработке функцией R-значения, атома (по УКА) или слоя (по УКС) по V-значению потока автоматически извлекается R-значение -
элемент слоя по УКС из V-значения с порядковым номером - индексом из V-значения. Наследование (см.выше) свойств R-значения от Атома по УКА
и V-значения от R-значения позволяет избежать этих "извлечений" при необходимости обработки только свойств
Обрабатываемый функцией $Eval (р.6) очередной элемент потока – Атом или определяемая R-значением (по ссылкам УКА и УКС)
структура в ДРП идентифицируется функцией (синтаксис) как выражение согласно определениям следующего раздела (р.3).
Сам же такой поток выражений определяется как программа.
2.6 . Пространство и подпространства
При запуcке функции $Eval до начала обработки ею потока выражений (аргумент) формируется ее собственное пространство - пустой слой. При первом обращении в обрабатываемом (исполняемом) ею выражении имени-индексу со свойством %.|1% формируется подпространство с указанным индексом как элемент слоя пространства:
<Имя поодпространства>:<подпространство> %.|1% <Имя поодпространства>::=<имя-индекс> (2-1) <подпространство>::= <структура>
Напомним (п.1.3), что обработка функцией $Eval очередного выражения потока cводится к развертке новой ветки СА – структуры
из микро-ЭВМ, адекватной структуре этого выражения, подсоединяемой корнем к $Eval и выполняющей его вычисления. В этом выражении
его члены обращаются к подпространствам (2-1) пространства функции $Eval по их именам.
Согласно п.3.1.1 выражение (аргумент) из одного этого имени возвращает V-значение узла – подпространства в слое пространства.
В отсутствие подпространства с таким именем согласно п.1.3(9) оно ищется в пространстве функции $Eval (активации),
обрабатывающей выражение с исходной функцией $Eval и т.д. вверх по иерархии дерева из $Eval в СА.
2.7 . Функциональная Потоковая Машина. Ядро
При запуске ФПМ запускается фактически функция $Eval, обрабатывающая вводимые вручную (поток) выражения,
являющаяся корнем СА с собственным (глобальным) пространством и удаляемая только при выключении ФПМ.
При выключении ФПМ пространство этой $Eval сохраняется и при перезапуске восстанавливается.
3. Функционирование ФПМ. Выражения языка программирования
<Выражение [ФПМ]>::= <Подпространство> | <Подобласть> | <Литерал> | <Вызов унарного примитива> | <Вызов примитива настройки> | <Вызов встроенной функции> | <Встроенное макроопределение> | <Вызов пользовательской функции [с макроопределением пользователя]>
Выражение исполняется функцией $Eval согласно р.1 разворачивающей это выражение в соответствующую ему ту же структуру ветку (поддерево)
СА (Структура Активаций функций) - структура из микро-ЭВМ, на которой организуется вычисления, формирование и обработка потоков данных.
Ввиду идентичности структур выражения и СА будем говорить о формировании потоков на выходах (а) функций - поступлении их входы функции,
аргументами которой функции (а) являются, понимая, конечно при этом физические входы и выходы соответствующих микро-ЭВМ на СА.
3.1. Унарное значение. Подпространство и литерал
Выражения ‘Подпространство’, ‘Подобласть’ и ‘литерал’ возвращают унарное (единственное) значение(%~;%) и которое можно использовать в функциях как поток из одного элемента. Унарное значение может кодироваться и передаваться от аргумента к функции (на ее вход) физически (СА) проще, чем поток (п.3.3).
<Подпространство>::= <Имя-индекс [элемента слоя `Пространство`]> %.|I1% <Подобласть>::= <Имя-индекс [элемента слоя `Область`]> %.|I~1%
Здесь "Имя-индекс" возвращает V-значение элемента подпространства или подобласти (п.2.6) ближайшей к корню дерева СА (р.1) функции $Eval, исполняющей выражение. Напомним, что в самом выражении может присутствовать (и не одна!) $Eval, исполняющая выражения, поступающие на ее вход. Именно об этой $Eval здесь и далее (выражение и потоки на нем) идет речь
<Литерал> ::= <Атом[кроме имени-индекса]><Слой> | %.~|% <Слой> | # [- Неопределенный элемент] %~.,% %#%
Литерал (как выражение) возвращает ссылки (копии) на самое себя в выражении – R-значение (%@%). Возвращаемые литералами R-значения
дополнительно приобретают свойства %.?% и/или %,?% защиты, лишь предупреждающие о возможной необходимости
(определяемой и производимой самим пользователем посредством выражений языка!) блокировать изменение, соответственно,
атома по УКА<>0 и/или слоя по УКС<>0 R-значения. Определяемое для слоя литерала (R-значения) свойство %,?% ('?')
автоматически распространяется по всем уровням иерархии структуры литерала в виде пар свойств %.?% и %,?%
для атомов и слоев. Собственно свойство '?' защиты включается в общий список свойств атома и/или слоя.
При копировании R-значения (ссылок УКА и УКС) автоматически вместе с ним копируются и эти свойства, а также свойства,
определяющие виды атомов, наличие атома и слоя и др. Свойства защиты могут быть установлены или удалены операциями _Calc
3.2. Вызов унарного примитива
<Вызов унарного примитива> ::= <Имя примитива>([<Выражение>{,<Выражение>}]) %.|%
Эти фактически следующие два с фиксироваными именами (имя-индексы) НЕ имеющие аргументов примитива, возвращающих унарное значение:
1) Lit(<Структура[ c %.,%]>) – расширение определения литерала: возвращает R-значение структуры (%.,%).
Необходимость в таком дополнительном определении литерала возникает исключительно в случаях, когда <Структура> синтаксически является
встроенным макроопределением, вызовом функции или примитива. В этом случае блокируется выполнение этой "Структуры" как выражения
2) Data() – возвращает элемент (Атом, R- или V-значение) потока данных со второго входа (п.3.2.4) функции $Eval (р.6),
обрабатывающей выражение (элемент первого входа) с этим примитивом.
3.3. Вызов примитива настройки функции
<Вызов примитива настройки>::= <параметр настройки> | %._% <имя примитива настройки>(<аргумент>{,<аргумент>}) %._% <аргумент>::= <Литерал>
Этот вызов имеет вид вызова функции (см. далее) и отличается тем, что НЕ имеет выхода, а служит исключительно для настройки функции
(точнее, реализующей ее ветки СА), организации и перестройки обрабатываемых и формируемых функцией потоков данных в СА. Как правило,
аргументы примитива настройки являются литералами (не вычисляются!). Положение вызовов примитивов настройки среди аргументов функции
НЕ влияет на результаты ее работы и потому такие аргументы определяются как "прозрачные" и подробнее рассматриваются в р.4 и р.5
3.4. Вызов встроенной в ФПМ функции
<Вызов встроенной функции> ::= <Имя функции>(<аргумент>{,<аргумент>} <аргумент>::=<[Имя параметра>:]<Выражение> %.|1%
Первыми последовательно слева направо вычисляются аргументы-параметры, определяемые их именами или позиционно (в слое аргументов) самой
функцией. Если аргумент - параметр формирует поток, то в качестве унарного его значения (%~;%) принимается первый элемент потока, включая,
возможно, признак завершения потока - элемент без свойств (%%). При этом остальные остальная часть потока прерывается вместе с формирующим
ее выражением и с удалением соответствующей части ветки СА. К обработке параметров можно подключать средства калькулятора _Calс
&nbps; После вычисления параметров параллельно запускаются и функционируют аргументы функции, формирующие потоки, которые обрабатываются
функцией. Формируемые функцией результаты обработки параметров и/или входных потоков могут возвращаться функцией на синтаксически
определяемый главный выход и дополнительные определяемые примитивом _Out (п.4.2) дополнительные выходы. Как и входны, так и выходные
потоки функции можно параллельно обрабатывать подключением калькулятора _Calc
3.4.1. Параметры функции
Параметры различным образом определяются для конкретных встроенных функций (р.4). Вместе с тем существуют параметры, одинаковым
образом используемые всеми или частью функций. Более того, в состав аргументов любой функции можно вводить дополнительные
параметры, используемые вводимыми пользователем в дополнительных операциях калькулятора _Calc при обработке как тсамих параметров,
так входных и выходных потоков функции и даже при реализации действий самой функции или их корректировке.
3.4.1.1. Стандартные Параметры функций
1) Struct:<аргумент функции>
- объявляет аргумент функции обрабатываемой структурой. По умолчанию Struct, как правило, 1-й аргумент (функции $In, *Tree, п.4.3.3.1
и п.4.1.4). Даже в отсутствие определения функцией этого параметра им можно воспльзоваться для потокового входа функции, чтобы принять
только первый элемент потока на этом входе
2) T_out:<количество мкс>
- Если формирование очередного элемента выходного потока заняло менее указанной аргументом величины тайм-аута, то выдача
этого элемента на выход задерживается на разницу между ними – до величины тайм-аута. в отсутствие этого задаваемого параметра
(по умолчанию) он принимается равным 0
3) Sum:<исходное значение>
- При операциях вычисления итогов при обработке функцией входных потоков (п.3.5), этот параметр задает исходное значение
регистра "Сумматор". В отсутствие этого задаваемого параметра (по умолчанию) он принимается равным 0 или устанавливается
содержанием функции, но всегда существует. Как и T_out этот параметр НЕ определяется позиционно в списке параметров функции
(без имени). При использовании операций калькулятора _Calc в вычислениях функции, а также в обработке потоков на выходах
функции (п.4.2.2 и п .4.2.3) фактически значение параметра Sum возможно после обработки аналогичными операциями (п.3.4.1.2)
принимаеися в качестве исходного
3.4.1.2. Контроль и обработка параметров функций
Для этой цели необходимо включить в состав аргументоввключить определяющий эти операции примитив настройки:
_Par(<Имя параметра>:<операции>{,<Имя параметра>:<операции>}) <операции>::= <операция> | <ряд операций> <операция>::= _If(<условие>,<операция>{,операция}) | <собственно операция> | _if(<условие>,<операция>{,операция}) <условие>::=<Свойства> | (<Свойства>{,<Свойства>}) <собственно Операция>::= _Go| _Break | <формула> <формула>::`<операция _Calc>{;<операция _Calc>}` <операция _Calc>::=[<операнд1>]<Код операции>[<операнд2>] <операнд1>::=<операнд>[<Свойства>] <операнд2>::=<операнд>[<Свойства>] <операнд>::=<литерал> | <Результат [последней] операции _Calc> | <результат вычислений> | <Имя параметра> <Код операции>:= + | - | ++ |+= | = | -> | & | @ и др. по п.5.3 <Результат операции _Calc>::= . <результат вычислений>::= !
<ряд операций>::= {<операция>{,<операция>}}
1) Все это означает использование калькулятора _Calc. К началу выполнения операций ряда значение параметра (возможно принятого по умолчанию) помещается в регистр '!' и по их окончанию значение '!', возможно (не обязательно) скорректированное возвращается тому же параметру, если последней выполненной операцией НЕ является _Break, прекращающая выполонение операций ряда, как и функции в целом.
2) В ряде операций слева направо выполняются операции, у которых в случае _If требуется соответствие регистра '!', а в случае _if
регистра '.' "условию", а точнее одному из формулируемым условием Свойств. И тогда выполняются последовательно указываемые вторым
и следующими аргументами примитива _If (_if) операции, в том числе:
- _If(...) и _if(...)
- формула с операциями _Calc
- _Go - следующие операции ряда пропускаются (НЕ выполняются)
- _Break - прервать (блокировать) выполнение функции (на выход функции выдается пустой поток).
3) Последняя операция в не пустом "ряду операций" может задаваться без условия - как "собственно операция", выполняемая
безусловно в отсутствие выполняемых ранее операций _Go или _Break
4) _If(<условие>) или _if(<условие>) вызывает операцию _Break (по умолчанию) при НЕвыполнении условия: значение регистра '!' или '.'
не отвечает ни одному из "Свойств" условия. Иначе выполняется операция _Go
5) <Имя параметра>:_If(<условие>) можно записать короче как <Имя параметра>:<условие>
6) "Свойства" условия задают отдельные или совместные требования к структуре как элементу потока (поток, унарное значение, атом,
V или R-значение), атому и/или слою R-значения, включая отсутствие указываемого V-значением R-значения, атома или слоя у R-значения,
заданного явно или неявно посредством указывающего его V-значения. Если V-значение НЕ указывает на конкретное R-значение, то считаются
отсутствующими его атом и слой. Напомним, что для отсутствие перечисленных выше компонентов сттруктуры элемента используется код '~',
как и для отсуствия свойств этих компонентов: элемента, атома и слоя R-значения (р.2)
7) Формула может изменить значение параметра (и/или его свойства), анализируемое и обрабатываемое следующими за формулой
операциями ряда. Вторым, третьим и т.д аргументом операции (примитива) _If (_if) также может быть _If (_if).
При наличии "Свойств" справа от операнда этот операнд до операции приводится к виду, определяемыми этими свойствами, однако сохраняя
при этом исходный вид и свойства.
8) Операция может состоять из одного операнда1 (в отсутствие кода операции и операнда 2) и тогда результатом операции (регистр '.')
становится Операнд1 после приведения его к требуемым Свойствам справа от него (если они заданы).
9) При переходе от выполнения одной формулы к другой содержимое регистров '!' и '.' сохраняются на момент завершения первой
из них.
Напомним (п.2.1), что для отрицания свойств в их списке (условие) используется код '~'.
В формулах могут использоваться параметры, функции, в том числе отсутствующие, выключая стандартные. В этом случае используются
их исходные значения по умолчанию.
3.5. Встроенные макроопределения
Это макроопределения, явно не определяемые пользователем в подпространствах. В соотвествии с ними их макросы, как и в случае явного
макроопределения пользовательских функций (п.3.6, р.7), подменяются функцией $Eval только в СА на выражения, не содержащие такие макросы
(расширения) и потому имеющие более сложный для обозрения вид, например:
<Имя подпространства или подобласти>[<индекс>,...,<индекс>>] (3-2) в СА реализуется как операция индексирования структуры подпространства (подобласти) вглубь - по уровням иерархии (расширение): $In(<Имя подпространства или подобласти>, *Stream(<индекс>,...,><индекс>)) (3-3) <Имя подпространства или подобласти>{<индекс>,...,<индекс>} (3-4) в СА реализуется как $Sel<Имя подпространства или подобласти>, *Stream(<индекс>,...,<индекс>)), формирующее (отбирающее) на выходе V-значения элементов подпространства или подобласти – слоя по списку индексов. Описание функций $In, $Sel и *Stream , соответственно, в 4.3. В выражениях (3-2) и (3-4) вместо списка индексов ( в скобках [] или {}) может использоваться выражение, вычисляющее поток индексов
Встроенные макроопределения, сокращая число вложенных пар скобок (уровней иерархии структуры) выражения, делают его лаконичнее и
выразительнее, отображая индексирование элементов иерархических структур способом, общепринятым в существующих языках программирования
3.6. Вызов пользовательской функции - макроопределение
<Вызов пользовательской функции> ::= <Имя подпространства>(<Выражение>{,<Выражение>}) %.|1%
Указанное именем подпространство содержит реализацию этого макроопределения пользовательской функции (р.7) в виде выражения, обрабатываемого
функцией $Eval - расшифровки макроопределения (р.6). – При формировании соответствующей ветки СА функция $Eval неявно (без изменения
исходного выражения) подменяет вызов пользовательской функции - макроса его расшифровкой: подмена производится исключительно в структуре СА!
На пользовательские функции распространяются правила для встроенных функций, включая использование параметров функции, примитивов управления
потоками (Out, _Chanal и дополнительные выходы с операциями). Отличие состоит в том, что параметры функции (их имена и назначение) теперь
могут определяться макроопределением функции, составляемым самим пользователем
Примечание: Понятно, что имя пользовательской функции не может совпадать с фиксированными именами Lit и Data унарных примитивов (п.3.2)