2012/09/21 13:22:29

Функциональная потоковая ЭВМ. Микропрограммирование функций. Программа

Статья продолжает проект (разделы 5 и 6) не фон_Неймановской структуры потоковой ЭВМ с параллельной обработкой потоков данных и выражений коллективом микропроцессоров – Структурой Активаций (СА), динамически перестраиваемой по структуре очередного выражения – суперпозиции фуцнкций. Здесь рассматриваются подробнее основные средства микропрограммирования входных и выходных потоков функций, как и основных действий функций, рассмотренные в предыдущем разделе 4. Наконец, вводится понятие программы, как потока выражений и основанные на этом понятии основные встроенные (без явного определения пользователем) макроопределения

Содержание

Ссылки на все разделы проекта:

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)

5. Микропрограммирование функций

Эти операции были рассмотрены при обработке параметров функции (п.3.4.1.2), входных потоков (п.4.2.1) функции, непосредственной ее реализации (п.4.1.2, п.4.1.4, п.п.4.3.2-4) и формируемых ею выходных потоков (п.4.2.3). Там же были рассмотрены основные примитивы _If, _if калькулятора, управляющие выбором последовательности операций, как и операции _Skip, _Break, _Go и общая структура формул и даже в качестве примеров некоторые операции _Calc (микрооперации), используемые в формулах. Здесь уточним эти определения, являющиеся стандартными при использовании операций калькулятора.

5.1. Общие принципы организации формул калькулятора

1) Напомним (р.2, р.4) что формула определяется как:

   `[<цикл>]<операция_Calc>{;<операция_Calc>}`

Цикл определяется только формулы, повторно запускаемой для каждого элемента кортежа (п.4.3.2, $Sync) или стека (п.4.1.4, *Tree)/

Возможна пустая формула `` - без операций _Calc, в которой ничего НЕ исполняется.

   <операция _Calc>::=
     <операнд>[%<Свойства>%] | %<Свойства>% |
     [<операнд[1]>][%<Свойства>%]<код операции>[<операнд[2]>][%<Свойства>%]

  а) Операция _Calc вида <операнд>[%<Свойства>%] при наличии справа Свойств приводит операнд к виду, отвечающим этим свойствам и результат приведения (или без приведения в отсутствие Свойств) помещает в регистр '.', сохраняющий результат последней выполненной операции _Calc.

  б) Операция _Calc %<Свойства>% эквивалентна операции .%<Свойства>%

  в) При наличии кода операции операнды аналогично (а) приводятся к указанным справа свойствам непосредственно перед операцией, однако без сохранения в каких либо регистрах именно результаты этого приведения используются в операции, если конечно рядом с операндом указаны требуемые свойства. В отсутствие таких свойств справа или при невозможности приведения операнда к указываемому виду операнд используется в операции в исходном виде. В некоторых операциях (код операции) НЕ допускается требование предварительного приведения одного из операндов к определенному виду и тогда это требование (Свойства) попросту игнорируются операцией.

  г) В отсутствие операнда, как и в случае (б) по умолчанию используется регистр '.'

2) В конечном итоге операндами операций _Calc являются регистры калькулятора, содержащие непосредственное значение атома (%\%) или ссылки: R- (УКА, УКС) или V-значение (р.2). В качестве таковых определяются:

  a) Параметры (п.3.4.1) функций, возможно после их приведения к окончатетельному виду рассматриваемым здесь и ранее (п.3.4.1.2) операциями. В любом случае используются имена параметров, определенные при вызове функции или определяемые по умолчанию. В отсутствие указываемого именем параметра операнд лише свойств и операции с ним попросту пропускаются, за исключением (1а) без Свойств справа, помещающий параметр без свойств в регистр '.'.

  b) Имена a-z элементов кортежа (функция $Sync, п.4.3.2), элементов стека при обходе иерархической структуры по контуру (генератор *Tree, п.4.1.3) и др. Непосредственно атомы и ссылки (R- и V- значения) НЕ допускается изменять в этих регистрах. Однако через ссылки в них допустимо изменять значения (атомы и слои), указываемые этими ссылками, за исключением особых случаев (например, *Tree), оговариваемых отдельно. В отсутствие указываемого именем элемента a-z действие идентияно случаю (a) отсутствия указываемого именем параметра (операнда)

  c) Регистр '.' обычно автоматически заполняется результатом выполнения операции за исключением некоторых отдельно оговариваемых операций. Используется также по умолчанию любого из требуемых операндов. При успешном выполнении операции в нем удаляются динамические (п.4.5) свойства 1 и/или 2, определяющие операнд (1-й и/или 2-й), вызвавшие ошибку, иначе, напротив, эти свойства автоматически появляются

  d) Регистр '!', чаще всего по завершению всех операций (и формул) используется в качестве результата обработки элемента входного или выходного потока, а также результата вычисления функции. В исходном состоянии до операций обычно в этом регистре предлагается (предполагаемый) результат обработки или вычислений, которые операции могут изменить.

P.S. Операнды '!' и '.' наиболее важны с точки зрения изменения порядка выполнения операций обработки, включая формулы, ибо примитивы _If и _if определяют этот порядок анализом свойств регистров, соответственно, '!' и '.'.

  e) Калькулятор допускает произвольное использование в формулах операндов регистров $a, $b, ..., $z, изначально без свойств (%%), за исключением части из них формируемых автоматически функциями:

   $i и $n - , соотвественно, число поступивших и принятых к моменту начала операций _Calc элементов во входном или выходном потоке, число сформированных функцией ($i) и переданных н($n) на выход результатов. ;$i=$n=0 (исходное значение) к началу обработки входного и формирования выходного потока, к началу работы функции (операции ее вычислений)

   $e - к моменту начала операций _Calc значение элемента потока, обработанного (входной поток), вычисленного или поступившего на конкретный выход (выходной поток) к началу операций для обработки следующего за ним очередного элемента. Исходное значение $e лишено свойств (%%)

   $l - количество элементов кортежа ($Sync), количество входных потоков ($Async, п.4.3.3),текущий размер стека при обходе иерархической структуры по контуру (*Tree, п.4.1.4)

   $k - количество поступивших (без свойства '^') из еще открытых входов функции элементов кортежа ($Sync), количество еще поступающих входных потоков - открытых входов ($Async), целочисленный индекс в V-значении вершины стека (*Tree).

  f) Операнд '^' является НЕ регистром, но ссылкой на один из элементов кортежа ($Sync) или стека (*Tree). Использование этой ссылки в качестве операнда эквивалентно прямому использованию указываемому ею элемента кортежа или стека. В отсутствие кортежа или стека указываемый ею элемент всегда без свойств. При организации цикла (1) в начале каждого повторения (цикла) формулы ссылка '^' автоматически устанавливается на очередной обрабатываемый элемент кортежа или стека вне зависимости от изменения ее принудительной (операцией _Calc, п.5.2) установки (на любой элемент кортежа или стека) в предыдущем цикле исполнения формулы

  g) Регистр $S - "сумматор", оформляемый операциями пользователя и сохраняющий свое содержимое при переходе от обработки (операций) одного элемента потока (входного или выходного) к другому, как и от одного вычисляемого функцией (операциями) результата к вычислению другого. Напомним, что исходное значение - структуру сожержимого этого регистра для (1) вычислений результатов функцией и (2) обработки выходных потоков определяется стандартным параметром Sum (п.3.4.1.1), который также может быть обработан операциями _Calc (п.3.4.1.2) до запуска функции. Напомним, что по окончании работы функции, использующей в качестве аргумента примитив _Sum (п.4.4), значение %S для (1) автоматически сохраняется в подпространстве - аргументе этого примитива. В отсутствие использования операциями (1) используется $S обработки (2) на главном - синтаксически определяемом выходе функции

5.2. Операции калькулятора в формулах

   <код операции>::= <спецсимвол>[<спецсимвол>]

Операции в формулах ориентированы на свойства операндов после возможного их приведения к указываемому справа от них виду:



1) '+'  - Сложение:

  a) Арифметическое сложение чисел целых (%.9%) и вещественных (%./%)

  b) Катенация строки (операнд1) с синтаксическим представлением (строка) согласно р.2 другим атомом любого вида (операнд2). При этом используемые в определении атомов операнда 2 ограничивающие его символы (` для формулы, % для свойств, ' для даты) НЕ переносятся в результат катенации

  c) Атом (первый операнд), определяемый (а) непосредственно (%\%) или R-значением (%.~,%) без слоя (ссылкой УКА при УКС=0) вместо со слоем R-значения (%~.,%) второго операнда без атома (УКС при УКА=0) образуют новое R-значение из УКА<>0 первого операнда и УКС<>0 второго

  d) УКС<>0 R-значения первого операнда без атома (%~.,%) и положительное целое (%\.9+%) или имя-индекс (%\.|%)- значение второго операнда, заданное непосредственно (%\%) образуют V-значение. При этом НЕ контролируется наличие R-значения указываемого этим V-значением. Для создания такого, возможно, отсутствующего R-значения (аналогично $In, п.4.3.3.1) необходимо применить операцию '.%&@%'

  e) К целочисленному индексу V-значения первого операнда прибавляется целое (%.9%) - атом второго

  f) К атому - дате (%.'~,%, р.2) прибавляется целое (с учетом знака, %.9%), образуя (результат) новую дату

Результат операции, как обычно помещается в регистр '.'. При других, отличных от перечисленных выше свойствах операндов операция НЕ выполняется, регистр '.' сохраняет свое исходное значение. Во всех рассмотренных вариантах операции с атомами последние определяеются непосредственно (%\%) или УКА<>0 R-значений

2) '+='  - отличается от (1) тем, что:

  a) регистр '.' при любом результате операции остается неизменным: результат, включая сброс или установку определяющих ошибку свойств 1 или 2, замещает значение первого (слева) операнда в (1a) и (1b) только, если этот операнд - заданный непосредственно атом (%\%) , в остальных случаях (1d,e,f) безусловно(1

  b) В случае операций (1a,b) с атомом, указываемого УКА R-значения первого операнда меняется только его значение по ссылке УКА в БП без изменения этой ссылки

  c) Слой по УКС R-значения первого операнда без атома (%~.,%) пополняется R-значением второго операнда (дополнение к операции '+').

  d) Слой по УКС R-значения первого операнда без атома (%~.,%) пополняется неопределенными значениями в указанном непосредственно (%.\9+%) вторым операндом количестве. При этом УКС первого операнда остается тем же

3) <операнд>'++'  - эквивалентно '<операнд>+=1'


4) '-'  - Вычитание:


  a) Арифметическое вычитание чисел целых (%.9%) и вещественных (%./%)

  b) Из строки - первого операнда, заданной непосредственно в регистре (%\."%), удаляется первое вхождение - подстрока, являющаяся синтаксическим представлением (строка) согласно р.2 другим атомом любого вида (операнд 2) без ограничивающих символов аналогично (1)

  c) Из целочисленного индекса V-значения первого операнда вычитается целое (%.9%) - атом второго. Полученное отрицательное значение индекса заменяется на 0

  d) Из атома - даты (%.'~,%, р.2) отнимается дата (второй операнд) и результат оформляется как целое (%.9%) - разница в днях

5) '-='  - отличается от (4):

  a) перечисленными (2a) и (2b) аналогично операции '+='

  б) Из слоя по УКС R-значения первого операнда без атома (%~.,%) удаляются последние его элементы в указанном непосредственно (%\.9+%) вторым операндом количестве. При этом УКС первого операнда остается тем же


6) '<операнд>--'  - эквивалентно '<операнд>-=1'

7) '*'  - Умножение:

  a) Арифметическое умножение чисел целых (%.9%) и вещественных (%./%)

  b) Строка - первого операнда, заданная непосредственно в регистре (%\."%), повторяется (катенация) количеством раз - целым значением атома (%.9+%) второго операнда

  c) R-значение первого операнда образует слой из повторений этого R-значения (копии УКА, УКС) количеством раз - целым значением атома (%.9+%) второго операнда

8) '/'  - Деление:

  a) Арифметическое деление чисел целых (%.9%) и вещественных (%./%)

  b) Из строки - первого операнда, заданной непосредственно в регистре (%\."%), удаляются все вхождения - подстроки, являющиеся синтаксическим представлением (строка) согласно р.2 другим атомом любого вида (операнд 2) без ограничивающих символов аналогично (4b)

  c) Из строки - первого операнда, заданной непосредственно в регистре (%\."%), вырезается ее начальный отрезок (регистр '.') длиной - целым значением атома (%.9+%) второго операнда. Остаток строки(конечная часть) помещается в регистр $a. Если требуемый начальный отрезок превышает размер исходной строки, то эта строка до указанного размера пополняется пробеллами, а строка в $a пуста ( длиной 0)

  d) Аналогично строке (b) делится слой по УКС R-значения первого операнда без атома (%~.,%): вместо символов строки используются элементы слоя. При этом начальный и конечный "отрезки" слоя помещаются в те же регистры, как R-значения слоев (также без атомов), каждый из которых помещается в отдельный выделяемый из ДРП свободный БП (уникальные УКС). Эти "отрезки" содержат копии R-значений (ссылок УКА, УКС) из исходного слоя

9) '"'  - Чтение строки в регистр '.': Следующие за кодом '" символы единственного операнда до конца операции (кода ';' или завершения формулы) помещаются непосредственно в регистр '.'. При этом помещаемые в результирующую строку коды ';' и '\' обязательно предваряются кодом '\', не помещаемым в строку.

P.S. Здесь в (9) некоторое отступление от определения операнда в п.5.1

10) '&'  - Трансляция строки (%\."%) - единственный операнд (регистр) в описываемую ею синтаксически структуру, возможно и иерархическую многоуровневую согласно п.2.1. Если эта строка представляет описание атома, то этот атом помещается непосредственно (%\%) в регистр '.'. Иначе в этот регистр помещается R-значение сгенерированной (результат трансляции) в ДРП иерархической структуры в соответствии с определениями п.2.1 (см. кодирование структуры)

Примеры формул с операциями:

`"'13.03.1943';@`  - в регистр '.' помещает дату 13.03.1943 (%\.'%)

`"'13.03.1943';@;%@%`  - то же, но дополнительно из даты в регистре '.'
		     формирует в том же регистр R-значение с УКА на
		     копию этой даты в выделяемом свободном БП

`"(Ab,$Num(7));@` - в регистр '.' помещает R-значение структуры
		     (Ab,$Num(7)) со свойствами %@~.,% (УКА=0, УКС)
		     слой без атома из двух элементов)

В этих примерах первая операция '"' помещает строку в регистр '.' и следующая '@', используя тот же регистр как операнд по умолчанию, транслирует эту строку согласно определению синтаксиса структуры в коды структуры (п.2.1), размещаемые в ДРП

11) '&"'  - Ретрансляция структуры, определяемой (указываемой) R-значением - единственного операнда (регистр) справа в строку (регистр '.')


12) '->'  - Копирование значения - непосредственно атома (%\%), R- или -V-значения (ссылок) первого операнда на место (регистр) второго

13) '=>'  - Копирование значения - непосредственно атома (%\%), R- или -V-значения (ссылок) первого операнда по ссылкам второго:

  a) R-значение - первый операнд помещается на место R-значения, указываемого V-значением - вторым операндом

  c) Атом непосредственно (%\%) из регистра - первого операнда или по УКА его R-значения с УКС=0 (%@.~,%) записывается в БП по УКА R-значения второго (вместо существовавшего там атома). Соответственно, размер БП атома (операнд 2) под новый атом (операнд 1) увеличивается или сокращается. В отсутствие у второго операнда УКА (УКА=0) или использования несовместимого типа БП ввиду несовпадения типов атомов (заменяемого и замещающего) операция НЕ выполняется

  b) R-значения элементов слоя (копии ссылок) по УКС R-значения первого операнда копируются в том же порядке в БП по УКС R-значения второго (вместо существовавшего там слоя пар ссылок <УКА,УКС>). Соответственно, размер БП слоя (операнд 2) под новый слой (операнд 1) увеличивается или сокращается.

  c) В случае R-значений обоих операндов с УКА<>0 и УКС<>0 (%@.,%) выполняются действия (a) и (b) параллельно

Внимание! В операциях (12) и (13) приведение к нужному виду (нужные свойства справа от операнда) до операции можно указывать только для первого операнда

14) '<='  - Приведение свойств первого операнда к виду (свойствам) второго

Внимание! В операции (14) приведение к нужному виду (нужные свойства справа от операнда) до операции можно указывать только для второго операнда

15) '<-'  - Копирование второго операнда по всем уровням иерархии, как структуры и запись в регистр первого


16) '<>'  - Определение размеров (длины) единственного операнда справа:

  a) Атома, определяемого непосредственно (%\%) или по УКА R-значения в отсутствие слоя (%@.~,%). Размер определяется согласно синтаксису представления атома, причем в размер атома НЕ включаются ограничивающие его определение символы ("" для строки и др.)

  a) Слоя (к-во элементов) по УКС R-значения в отсутствие атома (%@~.,%).


  в) Слоя (к-во элементов) по УКС V-значения(%@~.,%).


17) '='  - Сравнение атомов операндов (заданных непосредственно или по УКА): числа сравниваются числовым значением, даты с учетом их определения по календарю, прочие и не совпадающие типы атомов сравниваются как строки лексикокрафически по их синтаксису представления без учета ограничивающих их скобок (" для строк, ' для дат и т.д.). В частности, в этом случае "атом" с УКА=0 меньше всех. В случае равенства атомов операндов оба пополняются динамическим (п.4.5) свойством '='. Иначе меньшее пополняется динамическим свойством '<' и большее свойством '>'


18) Операции управления ссылкой '^ на элемент кортежа или стека' (без операндов):

  '<<' - установка ссылки '^' на элемент 'a' - начальный элемент кортежа или вершина стека

  '>>' - установка ссылки '^' на последний элемент кортежа или элемент на дне стека

  '>' - перемещение ссылки '^' на следующий справа элемент кортежа или ко дну стека

  '<' - перемещение ссылки '^' на следующий слева (к началу) элемент кортежа или к вершине стека

  '>a'- '>z' - установка ссылки на элемент 'a' - 'z'. В отсутствие указываемого элемента ссылка устанавливается на ближайший лексикографически (имя a-z) элемент

19) Операции управления операциями в формуле:

  '/*'[<Свойства>] - прервать выполнение формулы включая все ее циклы при соответствии Свойств регистра '.' указанным операцией

  '/+'[<Свойства>] - пропустить (не выполнять) следующую за этой операцию формулы при соответствии Свойств регистра '.' указанным операцией

  '//'[<Свойства>] - пропустить (не выполнять) все следующие за этой операции формулы при соответствии Свойств регистра '.' указанным операцией

Примечание: В отсутствие "Свойств" в указанных операциях эти операции выполняются безусловно вне зависимости от свойств регистра '.'

6. Программа, как управляемый поток выражений

Синтаксис:

  $Eval(<поток[выражений]>[,<поток[данных]>]
      [,_Area(<подпространство>{,<подпространство>})])		(6-1)

  <подпространство>::= <Имя подпространства>[:<Структура>]
 				%.|1%

Вычисляемые аргументами функции $Eval потоки выражений и данных поступают синхронно: очередное выражение потока и данное потока образуют аналогично $Sync кортеж из двух элементов 'a' и 'b', которые могут обрабатываться теми же (п.4.2.1) средствами на входе функции и даже операциями _If (_if), включая версию (4-1), а также посредством _Break и _Skip отказываться от обработки кортежей и даже использовать синхропотоки и _Scale. Вместе с тем реализация очередного выражения (элемент 'a') кортежа выполняется безусловно разверткой его в аналогичную структуру СА из микро-ЭВМ с подключением этого выражения к элементу 'b' кортежа примитивом Data(), входящим в выражение (п.3.2). Замена этого действия функции формулами _Calc здесь НЕ допускается. Очередным Выходом "обработки" такого кортежа является:

  • элемент 'b' кортежа, возможно, обработанный с доступом через Data() выражением, указываемым R-значением элемента 'a';
  • в отсутствие потока данных ( элемента 'b') унарное значение, вычисленное выражением 'a';
  • слой (%~.,%) из элементов потока сформированного корневой функцией выражения 'a'.

Напомним (п.4.5), что посредством аргумента _Sum любой функции из выражения, исполняемого $Eval, можно значение "Сумматора" этой функции поместить в подпространство этой или вышестоящей $Eval (см. далее)

У функции $Eval, как и у любой другой функции, могут быть введены дополнительные выходы и, как и главный выход Out функции $Eval могут быть отфильтрованы и обработаны аналогично любой функции (п.4.2.2, п.4.2.3). Понятно, что эти выходы и связываемые с ними каналы должны быть в пределах выражения, в которое рассматривавемая $Eval входит.

Напомним, что $Eval создает собственное пространство пустое или использующее определенное примитивом _Area подпространства, возможно, и неопределенные. Эта (а) $Eval связывается линиями связи с вышестоящей по уровню (б) $Eval, исполняющей выражение с рассматриваемой (а). Напомним, что при обращении выражения к подпостранству по имени вначале это подпространство ищется по имени в подпространстве (а) $Eval, исполняющей это выражение, в отсутствие такого в подпространстве $Eval (б) и т.д. вверх по иерархии. И только в отсутствие такового по всем уровням иерерхии $Eval подпространство создается в $Eval (а) с требуемым именем. Собственно такой поиск осуществляется параллельно по всем уровням иерархии $Eval.

На самом верхнем уровне отмеченной выше иерархии $Eval находится сама ФПМ, выполняющая вводимые вручную пользователем выражения (поток) и обрабатываемыми синхронно этими выражениями данные (поток). Более того вне (6-1) пользователь может определить подпространства посредством примитива _Area. Здесь же, введя вручную выражение содержащее один или более вызовов функции $Eval, пользователь определяет эти $Eval c их пространствами следующего ниже уровня и т.д. Не только корневая $Eval, но и формируемая в выражении $Eval может потребовать ввода потока выражений и данных вручную, как и подпространств ее пространства, т.е. не обязательно аргументом функции $Eval

Как и $Sync (п.4.3.2) функция $Eval завершается по исчерпании обоих ее входных потоков. При преждевременном окончании одного из потоков аналогично в кортеже повторно используется последний его элемент.
  Внимание! При преждевременном завершении потока выражений (не завершен поток данных от второго аргумента) и повторении последнего НЕ содержащего $Eval выражения потока в целях исключения потерь времени вычислений НЕ повторяется его развертка в СА и даже при наличии $Eval, обрабатывающей (1-й ее аргумент) НЕ вычисляемый (литералы) поток выражений, не содержащих обращений к пользовательским функциям(р.7) . В этом случае для его повторения попросту используется первая его развертка в СА возможно (не обязательно!) с повторной настройкой. Иначе в выражении повторяется лишь развертка поддерева (ветки) СА с корнем - $Eval, не отвечающей перечисленным выше условиям

  В заключение отметим следующее:

Декларативную структуру цикла for традиционных алгоритмических языков для повторения выражения здесь можно представить так:

 $Eval(*Row(Expr,<количество раз>) ,_Area(Expr:<выражение[структура]>)) -
    - подпространство Expr непосредственно в пространстве $Eval выражения
или
  вначале автономно создать подпространство Expr с требуемым выражением
  в пространстве
 	_Area(Expr:<выражение [структура его]>)
  функции $Eval, исполняющей следующее выражение:
 	$Eval(*Row(Expr,<количество раз>))
 

Еще раз обратим внимание на тот факт, что функция *Row (п.4.1.2) НЕ повторяет само выражение, но лишь ссылки на него, как и в следующем случае:

   $Eval(*Row(Lit(<выражение [структура его]>),<количество раз>))
 

Повторяемое здесь (цикл) выражение может включать (содержать) функции $Eval (да не одну!), обрабатывающую собственный поток выражений

  • `программу` ФПМ, повторяемую в цикле и т.д. с любым вложением циклов

6.1 Встроенные макроопределения


1) Можно определить подпространство Expr как слой из выражений 1-N и затем запустить программу – последовательное вычисление этих выражений:

   _Area(Expr:(<выражение 1>,<выражение 2>,…,<выражение N>))

Далее вычисление выражений 1, 2,…,N:

  $Eval(*Sel(Expr))					(6-2)

или то же самое короче, как встроенное макроопределение:

  $Eval(Expr)						(6-3)

Как и прочие встроенные макроопределения (6-3) преобразуется в (6-2) только при развертке в СА. Это преобразование выполняется только для Expr со свойствами %~.,% (слой). Если же Expr определяет выражение:

	Expr:<выражение>

то это выражение выполняется как обычно.

2) Вариант реализации той же программы непосредственно в выражении без использования подпространств использованием генератора *Lit (п.4.1)

  • ссылок (УКА, УКС, п.2.3) на выражения, описываемые как литералы:

  $Eval(*Lit(<выражение 1>,<выражение 2>,…,<выражение N>))

или то же самое короче, как встроенное макроопределение:

  $Eval{<выражение 1>,<выражение 2>,…,<выражение N>}	(6-4)


Используемые сокращения:

ФПМ	- функциональная потоковая машина
р.5	- раздел 5 проекта ФПМ
п.2.3	- пункт 3 раздела 2
СА	- Структура Активаций – реализующий выражение языка (суперпозицию
 	  функций) коллектив соответствующим образом связанных микро-ЭВМ, 
 	  каждая из которых  реализует отдельную функцию или примитив 
 	 (калькулятор) _Calc
ДРП	- динамически распределяемая память, над которой функуционируют 
 	  микро-ЭВМ СА
БП	- блок ДРП, выделяемый под атом или слой структуры
УКА	- указатель (ссылка на БП) атома (п.2.3)
УКС	- указатель (ссылка на БП)  слоя (р.2)