2013/06/11 21:09:05

Функциональная Потоковая Машина. Единая структура данных и программм

Этой статьей начинается детализация концепций (проект) не фон-Неймановской модели сегодняшних ЭВМ, сформулированных в работе "Универсальная Функциональная Потоковая ЭВМ с параллельными вычислениями", определяемой здесь как раздел 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)