/
Текст
Н. А. МАГАРИУ
ЯЗЫК ПРОГРАММИРОВАНИЯ
Н. А. МАГАРИУ
ЯЗЫК ПРОГРАММИРОВАНИЯ АПЛ
Е
МОСКВА «РАДИО И СВЯЗЬ» 1983
ББК 32.973
М12
УДК 681.3.06
Магариу Н. А.
Ml2 Язык программирования АПЛ. — М.: Радио
и связь, 1983. — 96 с., ил.
20 к
Приведено строгое описание языка АПЛ, выполненное с ис-
пользованием нормальных форм Бэкуса для задания синтаксиса
Основное внимание уделяется описанию семантики выражений и
структуры программ на языке АПЛ Даны рекомендации по про
граммированню и приведены примеры программ
Для разработчиков вычислительных систем и специалистов,
занимающихся вопросами реализации и эксплуатации математиче-
ского обеспечения ЭВМ
2405000000—035
М046(01)—83 Н4'82
ББК 32 973
6Ф7.3
Рецензенты доктор техн наук С Я. ВИЛЕНКИН, канд.
техн наук Е Т СЕМЕНОВА
Редакция литературы по кибернетике и вычислительной
технике
Николай Афанасьевич Магариу
ЯЗЫК ПРОГРАММИРОВАНИЯ АПЛ
Редактор И М Волкова
Художник В В Волков
Художественный редактор Н С Шенн
Технический редактор Г И Колосова
Корректор Л С Глаголева
ИБ № 164
Сдано в набор 04 10.82 Подписано в печать 17 01 83 Т-04617
Формат 84 X Юв’/и Бумага тип № 3 Гарнитура литературная
Печать высокая Усл печ л 5 04 Усл кр отт 5.25 Уч-нзд л 4,4
Тираж 12 000 экз. Изд № 19618 Заказ № 265 Цена 20 к
Издательство <Радно н связь» 101000 Москва, Главпочтамт, а/я 693
Ордена Октябрьской Революции и ордена Трудового Красного
Знамени Первая Образцовая типография имени А А Жданова
Союзполиграфпрома при Государственном комитете СССР по де
лам издательств, полиграфин и книжной торговли Москва, М 54,
Валовая, 28
© Издательство «Радио и связь», 1983
Предисловие
Наиболее часто используемой структурой данных при
разработке алгоритмов является массив — упорядочен-
ное множество однородных данных. Обработка массивов
средствами распространенных языков программирова-
ния (ФОРТРАН, ПЛ/1 и др.) осуществляется преимуще-
ственно покомпонентно. Однако при описании процессов
обработки во многих случаях удобно задавать выполне-
ние операций над целыми массивами и произвольными
подмассивами или изменять структуру массива. Именно
эти принципы обработки данных положены в основу
АПЛ. Язык программирования АПЛ предназначен для
обработки числовых символьных и логических массивов
информации и обладает свойствами, дающими ему преи-
мущество перед другими языками:
применение компактных обозначений для представле-
ния конструкций языка (программа иа АПЛ, как прави-
ло, в 5—10 раз короче чем на ПЛ/1);
использование большого набора широко применяемых
на практике операций для составления АПЛ-выражений,
причем операции над скалярами простым и естествен-
ным образом распространяются на векторы и многомер-
ные массивы;
создание и переструктурирование массивов данных,
а также определение и, по необходимости, переопределе-
ние типа и структуры переменной во время выполнения
программы;
возможность обработки массивов и произвольных
подмасснвов данных покомпонентно или целиком;
использование в качестве основной конструкции язы-
ка АПЛ-выражения, структура которого мало отлича-
ется от структуры арифметического выражения
Благодаря этим свойствам и тому, что составление и
выполнение программы на АПЛ может осуществляться
постепенно, язык является идеальным средством для
организации диалога с ЭВМ.
3
АПЛ входит в стандартное программное обеспечение
машин серии IBM/360 и 370 и других ЭВМ и широко
используется за рубежом. Особый интерес представляет
микропрограммная реализация языка. В нашей стране
программно реализованы версии языка АПЛ для ЭВМ
БЭСМ-6 (ВЦ АН СССР) и для ЕС ЭВМ (МЭИ,
г. Москва).
Преимущества языка и систем, реализованных на его
основе, позволяют применять АПЛ для решения самых
разнообразных задач: от инженерных и экономических
расчетов до моделирования систем и обработки графи-
ческой информации.
В предлагаемом описании языка АПЛ основное вни-
мание уделяется определениям выражений и правилам
составления и использования определяемых функций.
Независимо от степени знакомства читателя с языком
АПЛ рекомендуется читать книгу с самого начала. Осо-
бенное внимание при этом следует уделить § 2.8 и 3.1,
содержащим основные используемые в языке понятия и
обозначения. Определения операций, как правило,
даются отдельно для скаляров, векторов и многомерных
массивов При первом знакомстве с языком по данной
книге можно ограничиться изучением операций для слу-
чаев, когда операнды являются скалярами и векторами
В приложении содержится перечень всех операций и но-
меров страниц, содержащих их описание. При описании
языка используется символика, принятая в системе
APL/360. К сожалению, ограниченный объем книги не
позволил включить в нее более неформальные описания
некоторых конструкций языка и большего числа приме-
ров. Вместе с тем автор не снимает с себя ответствен-
ности за наличие в книге трудных для понимания мест
и возможных неточностей.
Автор глубоко признателен В. М. Курочкину за по-
лезные советы, Т. Е. Семеновой за замечания, сделан-
ные при чтении рукописи, С. Я. Виленкину за предложе-
ния по улучшению ее структуры и проявленный им боль-
шой интерес и поддержку, а также коллегам по кафедре
алгоритмических языков и программирования Кишинев-
ского госуииверситета, на которой была выполнена ра-
бота, за оказанную помощь.
Введение
АПЛ (APL —A Programming Language) — универ-
сальный язык программирования высокого уровня, ко-
торый в последнее время привлекает особое внимание
как специалистов по языкам программирования и вы-
числительной технике, так и непрофессиональных поль-
зователей ЭВМ.
Начальная версия АПЛ была предложена К. Е. Ай-
версоном (США) в 1962 г. [11]. Она представляет собой
систему обозначений (нотации), которая позволяет за-
дать в компактном виде алгоритмы обработки числовых,
логических и символьных скаляров, векторов и матриц.
Для обозначения последних используются строчные и
прописные буквы латинского алфавита, снабженные
верхними и нижними сложными индексами. Кроме тра-
диционных операций (арифметические, сравнения, логи-
ческие), которые распространяются на векторы и матри-
цы, в языке используется большое число специфических
операций над векторами, матрицами и подмассивами
с аналогичной структурой. Все операции имеют равные
приоритеты и используются для составления выражений,
которые выполняются справа палево Программа — это
последовательность пронумерованных строк-выражений.
Основными результатами выполнения строки являются
присвоения и/или указания на безусловные, условные
или альтернативные переходы. Переходы изображаются
боковыми стрелками.
Успешное применение этих нотаций для описания
функционирования вычислительных систем доказало нх
жизнеспособность [2, 12], однако реализация на ЭВМ
начальной версии АПЛ чрезвычайно сложна. В конце
60-х годов усилиями К. Е. Айверсона, А. Д. Фалькофа
и других сотрудников фирмы IBM были разработаны
линейные АПЛ-нотации, а операции были распростра-
нены па многомерные массивы Был разработан также
специальный терминал, клавиатура которого содержит
большое число знаков алфавита языка. Новая версия
языка была реализована в интерактивном режиме на
5
ряде машин серии IBM/360 и известна под названием
APL/360 [6, 13, 16, 20, 21]. В настоящее время АПЛ
реализован на машинах серий IBM/360 и 370, CDC,
BURROUS, UNIVAC и других зарубежных ЭВМ [26,
28, 33, 36]. Кроме APL/360 известны и другие версии
языка, как, например, APL*PLLS, APL.SV, APL/700,
в которых язык получил дальнейшее развитие в резуль-
тате расширения возможностей операций APL/360 и
добавления новых операций [6, 26, 28, 29, 35]. Пользу-
ются большим успехом микропрограммные реализации
языка. Наиболее интересными из них являются МСМ-70
(Канада), в которой полностью реализован APL/360, и
система APL |Х| (Франция), в которой язык и система
расширены для обработки графической информации
[25, 39]. Аналогичные разработки проводятся в США и
в других странах [26, 28, 29, 32, 36, 37, 38, 40, 41].
В ряде работ предлагается дальнейшее усовершенство-
вание языка введением в него более сложных структур
данных- обобщенных массивов (массивы массивов) и
древовидных структур [23, 24, 34]. В нашей стране
реализованы версии языка АПЛ для ЭВМ типа БЭСМ н
ЕС [3, 4].
Стандарта языка пока еще нет. В этом направлении
ведется большая работа (см. APL Quote Quad— 1979,
v.9, № 4). Все существующие версии языка объединяет
некоторое общее для них ядро операций и ряд принци-
пов, выражающих особенности языка.
В последнее время АПЛ пользуется огромной по-
пулярностью. Свидетельством этого является целый ряд
международных конференций, посвященных языку и его
применениям [26, 28, 29, 36]. Вопросы, связанные с раз-
витием, стандартизацией и применением языка, постоян-
но освещаются в периодических журналах APL Quote
Quad, APL News Letters, издаваемых в США и Канаде,
а также во множестве научно-технических статей АПЛ
имеет обширное применение. Он используется для опи-
сания и публикации алгоритмов [2, 5, 12], для решения
задач линейной алгебры и статистики [18, 29, 31, 44],
обработки графической информации [16, 36, 40], реше-
ния задач управления в экономике [19], создания мате-
матического обеспечения [38], описания и имитации
различных экспериментальных моделей [22, 24, 25, 35],
в обучении [15, 32, 36, 39], медицине [30], геологии [35]
и во многих других областях [26, 28, 29, 31, 32, 33, 36,
6
43]. Отметим также, что, по мнению многих ведущих
советских и зарубежных специалистов, в АПЛ нашли
отражение и частично реализованы многие концепции
современного программирования. Например, в работе
[9] указывается, что АПЛ является одним из самых
подходящих языков программирования для реализации
на векторных и матричных ЭВМ, а в работах [8, 42]
подчеркивается, что стиль программирования на АПЛ
наиболее близок к стилю функционального программи-
рования.
Однако существующие и доступные для использова-
ния в пашей стране описания языка [1—7, II, 14—19,
27] не отвечают в достаточной степени требованиям
строгости и простоты и к тому же имеются в ограничен-
ном количестве. Это затрудняет изучение языка, особен-
но с целью получения четкого представления о его син-
таксисе и семантике. Приводимое далее описание языка
АПЛ является, на наш взгляд, во-первых, сравнительно
простым и ясным, во-вторых, достаточно полным и точ-
ным. Оно содержит строгое описание основного набора
операций и основных принципов построения языка и
может быть использовано как для общего ознакомления
с языком, так и как справочное пособие, а также в ка-
честве основы для его реализации на ЭВМ.
1.
Структура языка
Назначением языка программирования АПЛ являет-
ся описание процессов обработки информации. Язык
разрабатывался как диалоговый, поэтому содержит це-
лый ряд средств, рассчитанных на интерактивную обра-
ботку данных. Например, средства для задания немед-
ленного выполнения выражений, введенных с терминала,
для обеспечения постепенного составления и выполнения
программ, для организации запроса данных с терминала
во время выполнения программы и др. Все определяе-
мые в языке конструкции представляются посредством
фиксированной совокупности символов.
В языке нет служебных слов Основной конструк-
цией, используемой для описания правил обработки, яв-
ляется выражение, содержащее в качестве своих состав-
ных частей скаляры, векторы, переменные, обращение
к основным и определяемым функциям. Скаляры и век-
торы являются первичными данными. Они могут быть
числового или символьного типа. С помощью некоторых
функций и первичных данных строятся массивы с же-
лаемым числом измерений. Тип и структура данных
определяются по их внешнему виду или семантикой
функций, которые их порождают.
В АПЛ отсутствуют статические средства для описа-
ния идентификаторов. В рамках одной программы в раз-
личные моменты ее выполнения один и тот же иденти-
фикатор может быть именем переменной или именем
подпрограммы. Переменные образуются во время рабо-
ты программы Тип переменной может быть неоднократ-
но изменен при выполнении программы, т. е связь меж-
ду идентификаторами и данными устанавливается или
переопределяется динамически.
Основными функциями в языке являются арифмети-
ческие операции, операции сравнения, логические опера-
ции, элементарные математические функции, присваива-
ние, вывод на терминал, создание многомерного масси-
8
ва, некоторые обобщенные операции над массивами нз
линейной алгебры и др. Онн обладают одним или двумя
аргументами. Аргументы, так же, как и результаты
основных функций, являются скалярами и/или массива-
ми. Обращения к основным функциям имеют ннфексную
форму. Все основные функции имеют равные приори-
теты
Определяемые функции суть подпрограммы, струк-
тура обращений к которым аналогична структуре обра-
щений к основным функциям. Обращение к определяе-
мой функции может входить в любое выражение нли
подвыражение н имеет тот же приоритет, что и обраще-
ние к основным функциям.
Выражения выполняются справа палево Если необ-
ходимо изменить порядок выполнения выражения, ис-
пользуются круглые скобки Например, значение выра-
жения 2X3+4 равно 14, а значение выражения 4+2X3,
так же, как н значение выражения (2X3)+4, равно 10.
С помощью выражений строятся самостоятельные
единицы языка—операторы. Различают два вида опе-
раторов: выполняемые п определяющие. Первый суть
одностроковое выражение, которое выполняется непо-
средственно после его ввода После исполнения текст
этого оператора становится недоступным, т. е теряется.
Результат выполняемого оператора либо выводится на
терминал, либо присваивается переменной.
Определяющий оператор обеспечивает возможность
описания повои, определяемой функции. При ее описа-
нии указываются ее характеристики- вид, нмя, аргумен-
ты, локальные переменные. Тело определяемой функции
задается последовательностью строк-операторов, каж-
дый нз которых представляет собой выражение, либо
оператор ветвления, либо комментарий. Оператор вет-
вления используется только внутри определяемой функ-
ции н служит для описания альтернатив и циклического
повторения вычислений. В результате выполнения опре-
деляющего оператора вычислительная система получает
информацию о вновь созданной функции Как отмечено
выше, обращение к ней может производиться нз любого
выражения. Допускаются рекурсивные обращения к оп-
ределяемым функциям.
Программа представляет собой последовательность
определяющих н/илн выполняемых операторов. Так как
АПЛ является интерактивным языком программнрова-
9
ния, то предполагается, что после выполнения каждого
оператора программы управление передается находяще-
муся за терминалом пользователю.
Синтаксис языка описывается с помощью БНФ [iOj.
Описания операций осуществляются частично средства-
ми самого языка (более сложные операции описываются
с помощью более простых, определенных ранее).
Примеры изображаются в той же форме, что и на
терминале в системе APL/360: а именно, пользователь
записывает свое сообщение, начиная с 7-й позиции стро-
ки, а система выводит информацию, начиная с 1-й пози-
ции следующей строки. Например:
25+25 Сообщение пользователя
50 Ответ системы
2.
Основные символы, идентификаторы,
числа, векторы, основные понятия
Язык строится из следующих основных символов:
<основной символ>. : =<буква > | < цифра > |
<ограничитель>
2.1. Буквы
<буква>; : =А| В| С| D |Е| F| G | Н111J | KI LI Ml NI
О | Р ] Q | R ] S ] Т] U) V] W ] X | Y | Z ]
Буквы не имеют индивидуального смысла Они ис-
пользуются для образования идентификаторов и после-
довательностей символов. Этот алфавит может быть
сужен или расширен добавлением любых других разли-
чимых знаков (т е. символов, не совпадающих с какой
бы то ни было буквой, цифрой и.ш ограничителем).
2.2. Цифры
<цифра> . .=0| 1|2|3|4|5|6]7|8]9
Цифры используются для образования чисел, иденти-
фикаторов и последовательностей символов.
2.3. Ограничители
<ограничитсль>: =<символ функции> | <зиак оператора
ветвлениях <скобка> | <разделитель> | <коиец
строки >
10
<символ функцни>; : = +|—IXKI^rl Llr III-' 1®| ? lOl^lAIVI
|АМ<1<1=1^|>1>1 Р I - I ‘ I Ш |ф11$11 । v
ZI\|E|TI±I|T| |D Ipp-
<знак оператора ветвлення> =-»
<скобка>::= (|) |[|]|’| V
<разделнтель>.:= |,|Е|<пробел> | О | |.
Пробел — это одна пропущенная позиция в последо-
вательности символов при ее наборе на терминале*.
Смысл остальных ограничителей будет указан в следую-
щих разделах. В языке используются и некоторые псев-
досимволы (перевод строки, возврат каретки и др.).
2.4. Идентификаторы
2.4.1. Синтаксис
Идентификатор> = <буква> |<идентификатор> <буква> |
< идентификатор > <цнфра>
2.4.2. Семантика
Идентификаторы не имеют неизменно присущего им
смысла, а служат для обозначения переменных, опреде-
ляемых функций, формальных аргументов, локальных
переменных и меток. Один и тот же идентификатор нель-
зя использовать для обозначения двух различных вели-
чин, за исключением случая, когда эти величины имеют
несовместимые области действия (см. п. 4.2.6).
2.5. Числа
2.5.1. Синтаксис
<целое без зиака> =<цнфра> | <целое без зиака><цифра>
<целое> =<целое без знака>|-<целое без знака>
<десятичиое чнсло>:, = <целое>|<целое>-<целоебеззнака>|
< целое без знака > |-.<целое без знака >
<число>: =<десятнчное число | <десятичиое чпсло>Е<целое>
Примеры.
О, 1, 0.75; -.75, -.314E3; ~0314E“3, IE—I
2.5.2. Семантика
Десятичные числа имеют свой обычный смысл.
В представлении числа Е<целое> является масштаб-
ным множителем, выраженным как целая степень деся-
" В примерах пробел обозначается символом —.
11
ти. Знак отрицательного числа изображается симво-
лом - (надчеркивапие). Целые 0 н 1 служат также в ка-
честве логических значений и обозначают соответствен-
но ЛОЖЬ и ИСТИНА. Если изображение числа содер-
жит десятичную точку, то число рассматривается как
вещественное, иначе как целое. Если целое является О
или 1, то оио рассматривается как логическое значение.
Предполагается, что для каждого целого существует
эквивалеитиое ему вещественное число.
Числа используются при составлении векторов чисел
и в,качестве аргументов функций. Они рассматриваются
как массивы без измерений (см. §2 8. Значение и типы).
2.6. Векторы
2.6.1. Сиитаксис
<всктор>-=<век10р чисел> | <вектор символов;»
<вектор чисел> = <число<пробе.1><хвост вектора>
<хвост всктора> • = <число> | <чпсло><пробел> <хвост
вектора>
<вектор символов> Непоследовательность спмволов>’
«^последовательность символов > =<пусто>|<реальная
последовательность>
<реальная последовательность;»•:= <элемент — символ>|
< элемент — епмволхреальная
последовательность;»
<элемент — сн.мвол> = <основиой символ кроме ’>|”
Примеры
2.5 -3.14 0 -.068Е-3
1 2 0 1
1 0 1 0
•А”’ »»
В первом примере изображен вектор вещественных чисел нз че-
тырех компонент, во втором — вектор целых чисел из четырех ком-
понент, в третьем — вектор логических значений нз четырех компо-
нент, в четвертом — вектор символов из трех компонент, в пятом —
пустой вектор символов
2.6.2. Семантика
Векторы состоят из компонент, обладающих одина-
ковыми свойствами: либо только из чисел, либо только
из символов. При подсчете компонент вектора символов
необходимо учитывать, что символ ’ (кавычка) представ-
ляется двумя идущими подряд кавычками. Компоненты
12
векторов нумеруются слева направо. Начало отсчета
компонент задается некоторой системной переменной
(см. § 2.8 и п. 3 2 2).
Тип вектора (числовой, символьный) определяется
его синтаксисом. Подтип числового вектора (веществен-
ный, целый, логический) определяется путем анализа
его компонент. Если все компоненты числового вектора
О или 1, то он логический. Если содержит хотя бы одну
вещественную компоненту, то вещественный, иначе —
целый.
Особую роль в языке играют векторы со- значением
пусто. Пустой вектор символов имеет вид ’<пусто
Пустой вектор чисел и вектор чисел из одной компонен-
ты явно не задаются, а являются результатами некото-
рых функций. Пустые векторы используются для вывода
на терминал пустой строки, для определения переменной
со значением пусто и в операторе ветвления *.
Значением вектора является последовательность его
компонент, выбранных в порядке возрастания их но-
меров.
2.7. Величины и их области действия
Различают следующие классы величины: перемен-
ные, определяемые функции, метки. Понятие «область
действия» связывается с идентификаторами. Говорят,
что объект, связанный с данным идентификатором, имеет
силу только в области действия этого идентификатора,
а вне ее является недоступным.
Начало и конец программы не определяются синтак-
сисом языка Интерактивный характер АПЛ предпола-
гает наличие некоторой активной среды, в которой соз-
даются, хранятся и выполняются части программы и
программа в целом. Областью действия глобальных ве-
личин является эта активная среда, локальных — соот-
ветствующая определяемая функция.
2.8. Значения и типы
Значение — это некоторое упорядоченное множество
чисел или символов. Частными случаями значения явля-
ются: отдельное число или отдельный символ, вектор
чисел или вектор символов. В общем случае под значе-
'' Знаком @ обозначается пустой вектор.
13
нием понимается некоторый массив чисел или некоторый
массив символов.
Массив — это совокупность элементов, с каждым из
которых связан упорядоченный набор целых чисел, на-
зываемых индексами. Набор индексов определяет одно-
значно элемент совокупности. (Частным видом массива
является матрица. Позиция элемента матрицы описыва-
ется двумя индексами.) Число индексов массива опре-
деляет его число измерений. Массив с п индексами на-
зывают n-мерным (n=0, 1, ...). Каждый индекс изме-
няется с постоянным шагом от начального до конечного
значения. Число значений индекса одного измерения
называют длиной или размерностью измерения.
В языке начальные значения индексов массивов за-
даются системой переменной )ORIGIN (см. п. 3.2.2).
Ее значением может быть только 0 или 1 *. Полное опи-
сание структуры массива дается его вектором размер-
ностей. Каждая компонента этого вектора является раз-
мерностью одного измерения массива: первая — первого
измерения, вторая — второго и так далее. Очевидно, что
число элементов массива равно произведению компо-
нент его вектора размерностей. Например, если массив X
имеет вектор размерностей 3 4, то это значит, что X яв-
ляется матрицей (двумерным массивом) из трех строк
и четырех столбцов. И так как значение переменной
)ORIGIN равно 1, то позиция первой компоненты матриц,
т. е. компоненты, которая находится на пересечении пер-
вой строки с первым столбцом, определяется парой ин-
дексов 1,1.
Если вектор размерностей массива содержит хотя бы
одну нулевую компоненту, то соответствующий массив
пустой. Вектором размерностей пустого вектора являет-
ся числовой вектор из одной нулевой компоненты.
В языке различают два типа данных: числовые и сим-
вольные. Отдельное число является элементарным дан-
ным числового типа, отдельный символ — элементарным
данным символьного типа. Тип скаляра ** так же, как и
вектора, который задается в явном виде, определяется
его синтаксисом. Многомерные массивы строятся из эле-
* >В дальнейшем будем предполагать, что значение переменной
JORIGIN равно 1
*” Скаляром называется отдельное число илн отдельный сим-
вол, т. е. символьный вектор вида ’<осиовиой символ>’.
14
ментарных данных одного и того же типа. Подтип чис-
лового массива (вещественный, целый, логический)
определяется либо путем анализа подтипов его компо-
нент, как, например, в случае вектора чисел (см. § 2 6),
либо функцией, которая его создает.
При описании процесса выполнения программы гово-
рят, что некоторые синтаксические конструкции обла-
дают значением. В АПЛ основной конструкцией явля-
ется выражение, поэтому целесообразно рассмотреть
связь между некоторыми выражениями и их значениями.
Значение любого выражения рассматривается как
массив:
1. Значением скаляра является массив с нулевым
числом измерений. Его тип определяется типом скаляра.
Его вектор размерностей — пустой числовой вектор.
2. Значением вектора является одномерный массив,
сформированный из компонент вектора. Тип значения
определяется типом вектора. Вектор размерностей зна-
чения— числовой вектор из одной компоненты, которая
указывает число компонент исходного вектора.
3. Многомерные массивы формируются в результате
выполнения некоторых функций языка. В обращениях
к этим функциям прямо или косвенно указывается век-
тор размерностей создаваемого массива и исходный
массив, из компонент которого формируется результи-
рующий массив. Тип создаваемого массива определяется
типом компонент исходного массива.
Таким образом, в языке АПЛ значение — это массив.
Оно включает в себя признак типа, вектор размерностей
и совокупность компонент массива.
Язык содержит широкий набор функций для обра-
ботки массивов Большинство из них ориентировано на
обработку массивов как единых объектов. Это значит,
что выполнение каждой такой функции может рассмат-
риваться как ее одновременное (параллельное) приме-
нение к каждой компоненте массива в отдельности, если
функция унарная, или к каждой паре соответствующих
компонент двух массивов-аргументов в отдельности, если
функция бинарная. Вместе с тем в языке содержится ряд
функций, предназначенных для обработки подмассивов
и отдельных компонент массива, и функций, посредством
которых можно изменить число компонент и/или пере-
упорядочить массив.
15
3.
Выражения
В главе содержатся описания выражений и их со-
ставных частей. Вначале вводится ряд обозначений и
определяются некоторые, часто используемые в дальней-
шем, понятия. Далее приводятся описания функции и
правил составления и вычисления выражений.
Язык содержит большое число функций, среди кото-
рых есть простые (сложение, вычитание, умножение, де-
ление, перестройка и др.) и сложные (вычет, факториал,
кодирование, декодирование, сжатие, расширение, ре-
дукция, внутреннее произведение, внешнее произведение
и др.). Сложные функции, как правило, могут быть вы-
ражены некоторой комбинацией простых функций. Они
введены в язык для обеспечения возможности компакт-
ного написания программ, что очень существенно при
ведении диалога.
Одни из основных принципов, который заложен в ос-
нову определения функций, состоит в их максимальном
обобщении. Согласно этому принципу определение каж-
дой функции должно, по возможности, распространяться
на все допустимые в языке структуры данных, т. е. на
скаляры, векторы и многомерные массивы.
По своей структуре функции разделяются на унар-
ные и бинарные. Все функции имеют равные приорите-
ты. Выражения выполняются справа налево. Часто один
и тот же символ используют для обозначения двух раз-
личных функций — унарной и бинарной. Например,
ЛХб— умножение, ХВ — знак числа. Назначение сим-
вола функции в выражении задается следующим обра-
зом. если слева от него находится операнд (первичное
выражение), то данное вхождение символа определяет
бинарную функцию, если символ функции — унарную.
<выражение>: =<;первичное выражение^» |
Собращение к функции присваивания> |
<обращеиие к основной функции>|
< обращение к определяемой функции >
Определения выражений и их составных частей яв-
ляются рекурсивными, поскольку оии входят в опреде-
ления обращений к функции присваивания, к основным
и определяемым функциям и некоторых первичных вы-
ражений.
16
3.1. Обозначения и некоторые базовые операции
Полное описание операций языка является громозд-
ким. Это обусловлено сложностью самих операций и тем,
что областями их определения являются скаляры и мно-
гомерные массивы Для большей компактности сложные
операции, по возможности, описываются через более
простые. Такое описание осуществляется с помощью
АПЛ-выражений.
В начале определения каждой функции приводится
схематическое изображение обращения к ней, в котором
вместо аргументов используются следующие обозначе-
ния: S и S1— произвольные целые положительные чис-
ла или нуль; V и VI — произвольные векторы или ска-
ляры; U—произвольные элементарные логические зна-
чения или логический вектор; М и Ml — произвольные
матрицы, векторы или скаляры, G и F— произвольные
значения.
Схематическое изображение применяют для опреде
ления области значений аргументов функций Например,
функция структура схематически изображается pF, где
р — символ функции, a F представляет любое, допусти-
мое в АПЛ, значение. Это означает, что функция опре-
делена для любого допустимого в АПЛ значения
При описании функций * и в некоторых примерах
используются следующие обозначения. R— результат
функции; LA— левый аргумент функции, RA— правый
аргумент функции; I, J, N — индексные переменные,
принимающие целочисленные и положительные зна-
чения;
Р — переменная, значением которой является вектор
2 3 5 7,
Е — переменная, значением которой является матри-
ца чисел
11 12 13 14
21 22 23 24
31 32 33 34;
* В приложении приведен перечень всех функций языка АПЛ н
номера страниц, на которых они описаны.
2—265 17
X — переменная, значением которой является матри-
ца символов
ABCD
EFGH
IJKL;
Q — переменная, значением которой является трех-
мерный массив чисел
111 112 113 114
121 122 123 124
131 132 133 134
211 212 213 214
221 222 223 224
231 232 233 234;
Полное определение функции дается по мере описа-
ния использующих их конструкций языка. Но для того,
чтобы можно было использовать некоторые простые
функции, содержащиеся в конструкциях, описываемых
позднее, при определении функций, содержащихся
в конструкциях, описанных раньше, ниже приводится их
краткое описание.
3.1.1. Структура: pF
Эта функция служит для вычисления вектора размер-
ностей аргумента. Примеры
Р’ +’
Вектором размерностей символьного скаляра
является пустой символьный вектор.
Р“
О
Вектором размерностей пустого символьного вектора
является вектор из одной нулевой компоненты.
р1.5 0 -1 -2
4
Аргумент функции — числовой вектор из четырех ком-
понент. Его вектором размерностей является числовой
18
вектор из одной компоненты. Значение этой компоненты
равняется 4.
РХ
3 4
Аргумент функции — переменная X. Вектором размер-
ностей переменной X является числовой вектор 3 4, так
как ее значением является матрица (символьный — дву-
мерный массив) из трех строк и четырех столбцов.
Для определения числа измерений значения необхо-
димо применить функцию структура два раза.
ррХ
2
Приведенное выражение вычисляет число измерений пе-
ременной X. При первом выполнении функции вычисля-
ется вектор размерностей переменной X. При втором —
вектор размерностей значения, вычисленного на преды-
дущем шаге. Результатом выражения является числовой
вектор из одной компоненты, которая указывает число
измерений переменной X.
х 3.1.2. Перестройка: VpF
Эта функция служит для создания массивов. Левый
аргумент представляет собой вектор размерностей соз-
даваемого массива, правый содержит элементы, из ко-
торых формируется массив. Тип результата тот же, что
и тип правого аргумента. В данном разделе предпола-
гается, что правый аргумент является скаляром или век-
тором. Примеры:
5р2.5 I 5р1 2 3
2.5 2.5 2.5 2.5 2.5 (12 3 12
В этих примерах иллюстрируется формирование число-
вых векторов из пяти компонент. Заметим, что если пра-
вый аргумент не содержит достаточного количества ком-
понент для формирования нового массива, то его компо-
ненты выбираются повторно.
5р’ ABCDEFGH’
ABCDE
Если же правый аргумент содержит больше компо-
нент, чем необходимо для нового массива, то выбирается
только необходимое число компонент.
2* 19
Op 2.5 2.5
Если левый аргумент — 0, то результат функции — пу-
стой числовой вектор.
2 2 3Р’ ABCDEFGHIJKLM'
АВС
DEF
CHI
JKL
Показано формирование трехмерного массива с векто-
ром размерностей 2 2 3.
3.1.3. Развертка: ,Е
Эта функция служит для преобразования аргумента
в вектор.
,6.5 I р,6.5
6.5 I 1
Скаляр превращается в вектор из одной компоненты.
Выражение р,6.5 вычисляет вектор размерностей значе-
ния ,6.5.
,Р
2 3 5 7
Если аргумент является вектором, результат функ-
ции — сам аргумент.
,Е
11 12 13 14 2 1 22 23 24 31 32 33 34
Если аргумент представляет собой многомерный массив,
то результатом функции является вектор, построенный
из компонент массива, выбранных в лексикографическом
порядке изменения индексов.
3.1.4. Конкатенация: G.F
Эта функция служит для формирования нового зна-
чения путем конкатенации левого и правого аргументов.
Аргументы должны быть одного н того же типа. Здесь
20
рассматривается конкатенация только скаляров и век-
торов. Длина результирующего вектора равняется сумме
длин векторов-аргументов, т. е. вычисляется выражением
(р, LA) + (p, RA). Примеры:
6.5, -10
6.5 “10
Результатом конкатенации двух скаляров является век-
тор из двух компонент.
Р.1 I 1,Р
23571 112357
В этих примерах показаны конкатенация вектора со ска-
ляром и скаляра с вектором.
’SOL’.’AR’
solar
Выполнена конкатенация двух символьных векторов.
3.1.5. Генератор индексов: tS
Эта функция служит для построения числового век-
тора, который представляет собой последовательность
из первых S чисел натурального ряда. Примеры
:7
1 2 3 4 5 6 7
Результатом функции является числовой вектор из семи
компонент
@
Если аргумент функции 0, то результатом функции
является пустой числовой вектор.
3.1.6. Редукция
Редукция — сложная функция, которая применяется
к компонентам векторов или многомерных массивов. Она
имеет следующее схематическое изображение’ ф/F, где
ф обозначает символ скалярной бинарной функции.
В данном разделе рассматривается редукция только для
случаев, когда аргумент является числовым вектором,
21
а ф— символом арифметической функции. Выполнение
редукции состоит в применении функции ф к компо-
нентам вектора справа налево. Примеры:
+/2 4 3 —/2 4 3
9 1
В первом примере компоненты вектора суммируются,
во втором — вычитаются. Во втором примере сначала
вычисляется разность 4—3, потом она вычитается из 2.
Таким образом, выполнение функции аналогично выпол-
нению выражения 2—'(4—3).
-Т-/2 4 3
1.5
Выполнение функции аналогично выполнению выраже-
ния 2-5- (4-т-З).
Х/2
2
Если операнд является скаляром, то результатом
функции является сам скаляр. Аргумент функции может
содержать различное число компонент. Полное опреде-
ление операции приводится в п. 3.8.1.
3.1.7. Присваивание
Присваивание рассматривается как бинарная функ-
ция, обращение к которой имеет следующий общий вид:
<переменная>*-А. Переменная — это имя (идентифи-
катор), данное некоторому значению. А — это произволь-
ное выражение. (В данном разделе приводится только
частичное определение функции присваивания. Ее пол-
ное определение дается в § 3.4.)
В частности, выполнение функции состоит в установ-
лении связи между именем переменной, указанной слева
от символа *-, и значением, указанным справа от сим-
вола Таким образом, в результате выполнения функ-
ции определяется или переопределяется значение пере-
менной. Значением функции является значение опреде-
ленной ею переменной. Примеры:
А 1^3.12345
РА1
22
Переменной Al присваивается значение скаляра
3.12345. Вектором размерностей переменной является
пустой вектор.
А1^’Ач-А4-С’
рА1
5
Переопределяется переменная А1. Ей присваивается зна-
чение символьного вектора из пяти компонент. Преды-
дущее значение А1 теряется.
А2«—2 3Р1.5
А2
1.5 1.5 1.5
1.5 1.5 1.5
В примере приводится АПЛ-выражение. При его выпол-
нении сначала создается матрица чисел из двух строк и
трех столбцов, которая потом становится значением пе-
ременной А2.
А4 <— рА4 *- ’А В’
А4
3
При выполнении выражения переменной А4 сначала при-
сваивается значение символьного вектора ’A-J-B’, потом
выполняется функция структура. Ее результатом явля-
ется вектор размерностей переменной А4; вектор из од-
ной компоненты, значение которой равно 3. При выпол-
нении второго присваивания результат функции струк-
тура становится значением переменной А4. Предыдущее
значение А4 теряется.
3.2. Переменные
3.2.1. Синтаксис
<имя перемеииой> :=<идеитификатор>
<иидекс>:: = <пусто> | <выражение>
<список индексов> . = Синдеко | <список иидексов>,
<индекс>
<перемеииая с индексамн> =<имя перемеиной>[<список
индексов >]
<перемеииая>. = <имя переменной>|<перемеиная
с индексами >
23
Сснстемная переменная> • = ) <ндентнфнкатор>
<обобщенная переменная> =<переменная> | <снстемная
переменная> IDllJl
3.2.2. Семантика
Обобщенная переменная — это наименование, данное
некоторому значению. Это значение может использовать-
ся в выражениях для образования других значений.
Язык не содержит средств для описания переменных.
Подразумевается, что если идентификатор не является
именем определяемой функции или не описан как-то
иначе, то является глобальной переменной. В языке име-
ется возможность объявить явно идентификатор именем
переменной. Это осуществляется путем его перечисления
среди формальных аргументов или локальных перемен-
ных в заголовке определяемой функции. Такое объяв-
ление используется только для локализации области
действия переменной. Тип и структура переменной при
этом не описываются (см. п 4.2 3).
Тип переменной определяется типом ее значения, ко-
торое устанавливается во время выполнения программы
посредством функции присваивания
При выполнении программы, по необходимости, могут
быть изменены все компоненты, отдельные компоненты
или группа компонент переменной. Все эти действия осу-
ществляются прн помощи функции присваивания. Таким
образом, тип переменной в текущий момент выполнения
программы — это тип последнего по времени присвоен-
ного ей значения. Очевидно, что изменение типа пере-
менной осуществляется путем присваивания ей значения
другого типа.
Переменная представляет собой массив. В выраже-
ниях ссылка на переменную (т. е. имя переменной) озна-
чает ссылку на все компоненты этого массива. Отдель-
ная компонента или группа компонент переменной ука-
зывается посредством переменной с индексами или по-
средством операции индексирования.
Переменные с индексами. Переменная с индексами
именует значение, которое является отдельной компонен-
той илн подмассивом индексируемой переменной или
новым массивом, состоящим из компонент индексируе-
мой переменной. Какое именно значение указывается
с помощью переменной с индексами, определяется по
фактическому значению ее индексов.
24
Каждое выражение из списка индексов занимает
одну индексную позицию переменной с индексами и на-
зывается индексом. Число индексов переменной с индек-
сами равняется числу измерений индексируемой пере-
менной.
Каждая индексная позиция воспринимается как фик-
тивная переменная, значением которой в общем случае
является массив целых положительных чисел. Вычисле-
ние индекса понимается как присваивание значения
этой переменной. Если позиция индекса пуста, то соот-
ветствующей фиктивной переменной присваивается зна-
чение выражения (iLD), где LD — размерность рассмат-
риваемого измерения. Значение переменной с индексами
определено только тогда, когда все компоненты индексов
находятся в пределах границ соответствующих изме-
рений.
Порядок вычисления переменной с индексами анало-
гичен порядку вычисления результата индексирования
(см п. 3.3.3). Рассмотрим несколько примеров перемен-
ных с индексами
Р[2]
3
Переменная с индексами Р [2] указывает на вторую
компоненту переменной Р.
Р[1 2 3 4] I Р( ]
2357 I 2 3 5 7
Переменные Р[1 2 3 4] и Р[ ] эквивалентны*, так как
пустой индекс заменяется выражением i4, т. е. Р[ ] =
= P[t4] = P[l 2 3 4]. Они указывают на то же значе-
ние, что и переменная Р.
Р[1 1 1 1 1]
2 2 2 2 2
Переменная Р[1 1 1 1 1] указывает иа новый одномер-
ный числовой массив нз пяти компонент, каждая из ко-
торых равняется первой компоненте переменной Р.
Е[2;] I Е]2;1 2 3 4]
21 22 23 24 | 21 22 23 24
* Здесь и дальше символ
валентности выражений языка
« используется для
АПЛ
указания экви-
25
Переменные Е[2;] и Е [2; 1 2 3 4] указывают один и тот
же подмассив переменной Е (одномерный числовой мас-
сив из четырех компонент), так как Е[2;] =Е[2;i4] =
= Е[2;1 2 3 4]. Этот подмасснв формируется из компо-
нент, которые находятся на пересечении второй строки
со всеми столбцами матрицы Е.
X];]
ABCD
EFGH
IJKL
Переменная Х[;] указывает на символьный двумерный
массив с вектором размерностей 3 4, т. е. на тот же мас-
сив, который является значением переменной X, т. е.
X[;]»X[i3;i4]-X|l 2 3; 1 2 3 4] = Х
X 4 3 2 1|
DCBA
HGFE
LKJI
Первая позиция списка индексов пустая, вторая — пред-
ставляет собой вектор, составленный из индексов второ-
го измерения матрицы X, выбранных в обратном поряд-
ке. Таким образом, Х[;4 3 2 1J^X[1 2 3;4 3 2 1].
Переменная Х[;4 3 2 1] указывает на новую матрицу
из трех строк и четырех столбцов, которая составлена
из компонент матриц X следующим образом:
X, t X,., Х„г X,.,
Х34 X,, Хзг Х31.
Нетрудно заметить, что матрица X [;4 3 2 I] получается
путем инверсирования строк матрицы X.
Индексы переменной с индексами могут быть много-
мерными массивами. В этих случаях переменные с ин-
дексами также являются многомерными массивами того
же типа, что и индексируемая переменная. Определение
структуры значения переменной с индексами описывает-
ся в п. 3.3.3.
26
Символы □ и U представляют собой имена особых
переменных. Их особенность заключается в том, что они
обладают значением только на время выполнения обра-
щения к функции, аргументами которой они являются,
причем, кроме случая использования переменных □ и
|Т| в качестве левых аргументов функции присваивания,
значения этим переменным задает пользователь с тер-
минала.
Если при выполнении программы встречается одна
из этих переменных и она не является левым аргумен-
том обращения к функции присваивания, то выполнение
программы прерывается.
Если выполнение программы прервано из-за обнару-
жения в ней переменной □, то на терминале с начала
новой строки выводятся символы а пользователю
разрешается вводить с терминала любое выражение или
символ Введенное правильное выражение вычисля-
ется и его значение присваивается переменной □. Вы-
полнение программы возобновляется. Если пользователь
вводит ошибочное выражение, то на терминале опять
с новой строки выводятся символы Таким образом
пользователю предлагается заново ввести выражение
или символ При вводе символа -> выполнение про-
граммы прекращается. В этом случае, если прерывание
произошло изнутри выполняемого оператора, его выпол-
нение не завершается и управление передается пользо-
вателю, если изнутри определяемой функции, то осуще-
ствляется выход из нее и управление также передается
пользователю.
Когда прерывание программы происходит из-за обна-
ружения в пей переменной | , |, на терминале устанав-
ливается начало новой строки и пользователю разреша-
ется вводить любую последовательность символов
или символ *. При вводе последовательности
символов она рассматривается как значение символьно-
го вектора и присваивается переменной |_J , после
чего выполнение программы возобновляется. Если поль-
* Символ
- получается путем наложения одной иа дру-
гую букв Q, Т и О
27
зователь вводит символ
, то выполнение про-
граммы прекращается, как в случае переменной □, ко-
гда пользователь вводит символ
Определение значений переменных □ и | Т| в случае,
когда они являются левыми аргументами обращения
к функции присваивания, описаны в п. 3.4.3. Примеры:
ЮХП+ -4
□ •-20+ 10
-140
Переменная □ является аргументом функции сложения Пользова-
тель ввел с терминала выражение “2O-4-1O, значение которого рав-
но ~10, поэтому результат равен -140.
’SOL’, |Т|
AR+ 1
SOLAR +1
Переменная | Vj является правым аргументом функции конкатена-
ция. Пользователь осветил последовательностью символов AR+1, ко-
торая и становится значением | , |. Результат конкатенации — сим-
вольный вектор из семи компонент
10XD + A- -4
□ = -
□ используется в качестве аргумента функции сложения. Пользо-
ватель ввел знак В этом случае выполнение выражения прекра-
тилось. Подвыражение справа от □, т е присваивание переменной
А значения ~4, считается выполненным
□:2 Q:-2
□ :3 Q:3
5 1
Переменная □ используется в качестве левого и правого аргумента
функции. Сначала устанавливается значение правого, а потом лево-
го аргумента.
Системные переменные являются служебными пере-
менными, которые определяются реализацией языка и
могут быть использованы и в программе. Они именуются
особыми идентификаторами В этом описании языка
первым символом идентификаторов системных перемен-
ных является символ ).
Тип, структура и исходное значение системной пере-
менной определяются реализацией языка и, за исключе-
нием значения, не могут быть изменены во время выпол-
нения программы. Значение системной переменной мо-
28
жет быть изменено с помощью функции присваивания.
Однако им не может стать значение любого выражения,
а лишь то значение, тип которого соответствует типу
системной переменной, и которое, кроме того, находится
в ее допустимом диапазоне значений. Для каждой си-
стемной переменной допустимый диапазон значений
определяется отдельно и зависит только от назначения
самой системной переменной.
Системные переменные используются для задания
некоторых динамических характеристик языка и про-
граммы. Например, системная переменная )ORIGIN
задает нижнюю границу измерений массивов, системная
переменная )РР задает количество цифр числа, выводи-
мых на терминал или на печать. Смысл каждой систем-
ной переменной поясняется в тех разделах, в которых
соответствующая системная переменная используется.
Подробная информация о системных переменных содер-
жится в [6, 16].
3.3. Первичные выражения
3.3.1. Синтаксис
<выражение 1> =<вектор>|П| | . || (<выражение>)
<иидекспроваиие> =<выражение 1>'[<список иидексов>]
<первичное выражение>-- = <число> |<выражеине 1>|
<индексироваиие> | <перемениая> | Совращение
к ннладической определяемой функции >
3.3.2. Семантика
Первичные выражения являются первичными состав-
ными частями обращений к функциям с аргументами,
кроме этого, они являются самостоятельными выраже-
ниями, т. е. сами являются правилами для получения
фактического значения. Что такое фактическое значение
первичного выражения — в случае числа и вектора ясно
Для переменных оно является текущим значением (по-
следним по времени присвоенным значением (см. §3.2)).
Порядок выполнения индексирования рассматривается
ниже Порядок вычисления значения обращения к нила-
дической определяемой функции рассматривается в §3.9.
Наконец, для выражений, заключенных в круглые скоб-
ки, их значение должно определяться рекурсивным ана-
лизом исходя из значений перечисленных выше первич-
ных выражений и правил выполнения функций с аргу-
ментами, обращения к которым включены в эти
выражения.
29
Первичные выражения, помимо того, что являются
составными частями обращений к функциям с аргумен-
тами, используются и как выполняемые операторы (см.
§ 4.1).
3.3.3. Индексирование
Все, что было сказано об индексах переменной с ин-
дексами, справедливо и для индексов операции индек-
сирования (см. п. 3.2.3).
Переменную с индексами можно рассматривать как
частный случай индексирования. Отличие между пере-
менной с индексами и индексированием выражается
в их использовании — переменная с индексами может
быть левым аргументом обращения к функции присваи-
вания, индексирование — нет. Индексирование указывает
значение, которое является подмассивом или новым мас-
сивом, состоящим из компонент индексируемого выра-
жения. Тип этого значения тот же, что и тип индекси-
руемого выражения. Вычисление результата индексиро-
вания осуществляется следующим образом:
1 . Вычисляются значения индексов. (Эти значения
могут быть и многомерными массивами.) Набор чисел,
составленный из компонент индексов (от каждого зна-
чения индекса берется одна компонента), определяет
компоненту индексируемого выражения. Вычисление
компоненты по набору индексов осуществляется извест-
ным способом.
2 Из компонент индексируемого выражения форми-
руется последовательность компонент VI. Каждая ком-
понента VI определяется набором компонент индексов.
Порядок расположения компонент в последовательности
VI определяется порядком изменения индексов, т. е. по-
рядком генерирования наборов компонент индексов.
В языке АПЛ установлен естественный, лексикографи-
ческий порядок изменения индексов.
Рассмотрим, например, составление последовательно-
сти VI для переменной с индексами Х[; 4 3 2 1]. Пози-
ция первого индекса пуста и так как X имеет вектор раз-
мерностей 3 4, то значение индекса для этой позиции
вычисляется выражением i3 Значением этого выраже-
ния является вектор целых чисел 1 2 3. Обозначим его
через II. Второй индекс также является вектором целых
чисел 4 3 2 1, обозначим его через 12. Тогда упомяну-
30
тая последовательность VI
образом:
X-iiui2t' \i„ f2t, X
у
• Л/1„ 12,’
составляется следующим
fl,. 12,’
v Y
ЛП,. 12,’ ЛМ„ 12,'"’
^/1», /2,.
Если заменить переменные /// и 12к (/=1, 2, 3; k=\,
2, 3, 4) их значениями, то получается следующая после-
довательность переменных с индексами:
Х|,4, Х|,з, Х|,2, Хи, Хгл, Хг.з, Хг.г,
Хг.ь Хз,4, Хз,з, Хз,2. Хз,|,
которая формирует последовательность из 12 символов;
DCBAHGFELKJI.
3. Вычисляется вектор размерностей результата.
Пусть //; /2; IN — список фиктивных переменных,
соответствующий списку индексов. Обозначим через V
вектор размерностей R. Тогда V вычисляется выраже-
нием. (pH), (р!2), ..., (pIN). Для рассматриваемого
примера вектор размерностей результата индексирова-
ния вычисляется выражением: (pi3), р4 3 2 1. Его зна-
чением является вектор 3 4.
4. Вычисляется результат R. Если VI — последова-
тельность значений, вычисленная на шаге 2, а V — век-
тор размерностей, вычисленный на шаге 3, то результат
индексирования вычисляется выражением VpVl, т. е.
R-*-VpVl. Другими словами, из последовательности VI
строится такой массив R, что его вектором размерностей
является вектор V, а вычисленная в лексикографическом
порядке последовательность его компонент—VI. При-
меры:
(2 3 5 7)|2 3pi4]
2 3 5
7 2 3
Индекс является выражением, значение которого матри-
ца целых чисел с вектором размерностей 2 3. Такой же
вектор размерностей имеет и результат индексирования.
Индексирование указывает на новый двумерный массив,
сформированный из компонент вектора 2 3 5 7.
(3 4p’DCBAHFGELKJI’)I; Ц
DHL
31
Индексируется двумерный символьный массив, который
создается в результате выполнения функции перестрой'-
ка. Первая позиция списка индексов пуста и, следова-
тельно, соответствующий индекс вычисляется выраже-
нием i3. Второй индекс равен 1. Вектор размерного
индексирования вычисляется выражением (pi3), (pl),
результат которого — вектор из одной компоненты 3.
Таким образом, индексирование указывает вектор, сфор-
мированный из компонент первого столбца созданной
матрицы.
(PQ)|3 2 1}
4 3 2
Индекс является вектором из трех компонент. Следова-
тельно, и индексирование указывает на вектор из трех
компонент Заметим, что индексирование указывает па
инверсированный вектор размерностей массива Q
2 3 5 6[0 р 1 2]
@
Индексируется вектор 2 3 5 7. Индекс — это пустой чис-
ловой вектор. Вектор размерностей индексирования вы-
числяется выражением р (0 р 1 2), значением которого
является числовой вектор из одной нулевой компоненты.
Таким образом, индексирование также указывает на
пустой числовой вектор.
3.4. Обращение к функции присваивания
3.4.1. Синтаксис
<обращение к функции присваивания> =<обобщенная
переменная>-^<выражеИ'Ие>
3.4.2. Семантика
Левым аргументом обращения к функции может быть
имя переменной, переменная с индексами, переменная □,
переменная U или системная переменная, правым аргу-
ментом — любое выражение.
Обращение к функции присваивания указывает зна-
чение, которое получается в результате применения
функции присваивания к аргументам обращения. Если
оно используется отдельным выражением, то представ-
ляет собой оператор присваивания (см. п. 4.1.4), если
внутри выражения, то указывает значение левого аргу-
мента после выполнения присваивания.
32
3.4.3. Функция присввивания
Эта функция служит для присваивания значения и,
соответственно, типа переменным, а также для измене-
ния отдельных компонент или группы компонент (остав-
ляя неизменным тип и структуру) переменных.
Следующие правила дают полное определение
функции.
1. Если LA — имя переменной, то RA может быть лю-
бое выражение. Переменной LA присваивается значение,
и соответственно, тип RA.
2. Если LA — переменная с индексами, то тип RA
должен совпадать с типом LA. RA должен быть либо
скаляром либо иметь вектор размерностей, равный век-
тору размерностей LA. В этом случае, если LA и RA
являются массивами с числом измерений большим или
равным 1, то каждой компоненте LA присваивается зна-
чение соответствующей компоненты RA, а если RA —
скаляр, то каждой компоненте LA присваивается значе-
ние скаляра. __
3. Если LA — переменная □ или переменная то
RA может быть значением любого выражения. Незави-
симо от того, какая из переменных, □ или |~П, является
левым аргументом, выполняются одинаковые действия,
а именно, переменной LA присваивается значение RA,
которое потом выводится на терминал н/или на печать.
Этот случай присваивания рассматривается как
функция вывода, которая может быть использована для
вывода на терминал и/или на печать промежуточных и
конечных результатов выражения. Правила вывода опи-
сываются далее.
4. Если LA — имя системной переменной, то правый
аргумент RA должен иметь тип и структуру LA и дол-
жен быть значением из допустимого диапазона значений
LA. Переменной LA присваивается значение RA. Тип и
структура LA не меняются.
Значение функции присваивание — это значение обоб-
щенной переменной, являющейся ее левым аргументом,
после того, как ей присвоено значение согласно прави-
лам 1—4. Примеры.
В п 3 17 рассматривается ряд примеров использования функ-
ции присваивание для задания и изменения значений и. соответст-
венно. типов переменных Ниже приводятся примеры применения
этой функции для изменения отдельных компонент или группы ком-
понент переменной без изменения ее типа и структуры
3—265 33
X [1; 1 4] «- ’42’
X
4ВС2
EFGH
I J KL
X [ 1;]«-’1234’
X
1 2.34
EFGH
I JKL
Функция присваивание используется для изменения группы компо-
нент переменноП X
0 0 0 0
0 0 0 0
0 0 0 0
Переменная с индексами Е [.] указывает на вес элементы матрицы
Е Правый аргумент является скаляром 0 Прн выполнении функции
все компонсн1Ы матрицы Е устанавливаются равными значению ска-
ляра . Выражение Е[,]«-0 неэквивалентно выражению Е-<-0.
Функция вывод рассматривается как частный случай
функции присваивание. Она имеет одно из следующих
схематических изображений- □-<-£ или Z7. С функ-
цией вывода связана системная переменная )РР. Эта пе-
ременная задает количество значащих цифр числа, ко-
торые можно вывести на терминал. Значение переменной
)РР может быть изменено в диапазоне от 1 до k, т. е.
)РР может принимать только одно из значений 1; 2; 3;
4; ...; k, где k — максимальное число цифр чисел, пред-
ставляемых в ЭВМ, на которой реализуется язык. Чтобы
облегчить описание примеров, присвоим переменной
)РР значение 4, т. е )РР*-4.
При выводе значений на терминал соблюдаются сле-
дующие правила:
1. Вывод на терминал значений скаляров и векторов
начинается с левого края строки терминала.
2. Количество значащих цифр числа, выводимых на
терминал, меньше или равно количеству значащих цифр
числа, хранимых в системе.
3. Числа, по абсолютному значению меньшие 1 и
большие илн равные 0.1, представляются на терминале
* Так как переменные Р, Е, X u Q используются и в других раз-
делах, то предполагается, что выполнение в данном разделе при-
сваивания не изменило исходных значений этих переменных в дру-
гих разделах
34
с нулем перед точкой и, если необходимо, округляются.
Например,
-0.123486 I -0.123412
0.1235 | -0.1234
4. Числа по абсолютной величине меньше 0.1, числа
с дробной частью и по абсолютной величине больше 1 и
целые числа по абсолютной величине больше —1 +10>|<)РР,
представляются на терминале в нормализованном виде
с десятичным порядком и с одной ненулевой цифрой
перед десятичной точкой. Если необходимо, при выводе
числа округляются. Например,
-0.0012345
-1.234Е-3
-3,1235
-3.123
-12345.05
-1.234Е4
31236Е-4
3 124
5 Целые числа по абсолютной величине больше 1 и
меньше 10>к)РР представляются на терминале без изме-
нения. Например,
-999
-999
6 Вектор чисел представляется как последователь-
ность чисел с одним пробелом между компонентами.
Между компонентами вектора символов пробелы не
оставляются.
7. Если вектор (или строка матрицы) не помещается
полностью в одной строке терминала, то его оставшиеся
компоненты выводятся в последующих строках. В этом
случае в начале строки-продолжения оставляются 6 про-
белов.
8. Матрица выводится на терминал как последова-
тельность векторов-строк, «-мерный массив («>2) —
как последовательность матриц. Между матрицами
оставляются две пустые строки. (Количество матриц для
«-мерного массива А вычисляется выражением
Х/(рА) [i((ppA)—2)].)
9. Пустой массив выводится на терминал в виде пу-
стой строки.
Результаты выражений, приведенных в качестве при-
меров в различных разделах, напечатаны в соответствии
3* 35
с вышеперечисленными правилами. Рассмотрим еще не-
сколько примеров.
□ *- X [1; 1 4] *—’42’
42 2
12
14- □ *—А*—2
В последнем примере при выполнении функции вывода
печатается значение переменной А, потом — значение вы-
ражения.
3.5. Обращения к основным функциям
3.5.1. Синтаксис
<спмвол скалярной унарной функцнп> =+| —|XvZ|-^l*l Г |L |
ИЧ ®|’|О|~
<спмвол скалярной бинарной функции> = —|Х |-ь| * I Г
I 14® |O|AIVI Al ¥|<|^| = |=fc>|>
<обращенис к скалярной унарной фуикции> = <снмвол
скалярной унарной функции> <выражсние>
<обращсиие к скалярной бинарной функцпи>. = <первнчное
выражсннеХснмвол скалярной бинарной
функции Хвыражение>
<обращение к скалярной функции> =<обращение к скалярной
унарной функции > | <обращенпе к скалярной бинарной
функцпи>
<символ смешанной унарной функцнп> •=p|,|i|'^l^|®|Q| УIQ
<снмвол смешанной бинарной функцип>::=р|1|е|||||,| /1\
ф|К|’1ТШЭ
<обращеиие к смешанной унарной функцин>. =<символ
смешанной бинарной функции><выражение>
<обрашеиие к смешанной бинарной фуикции> • = <первичное
выражсннеХснмвол смешанной бинарной
функции > <выраженне>
<обращение к смешанной функции> =<обращение к смешанной
унарной функпш1> | <обра1цснпе к смешанной
бинарной функции>
<измсрение> =<целое без зиака>
<спмвол редукции> =<символ скалярной бинарной функцпн>/|
<снмвол скалярной бинарной фуикцнп>/
[<измерение>]
<символ унарной композиции> =<снмвол редукции >|
(Т) [<нзмерение>]
<спмвол бинарной композпции>’: = <спмвол скалярной бинарной
функции > <символ скалярной бинарной
функцию О <спмвол скалярной бинарной
функцию Ф [<нзмеренне>] |/[<пзмеренне>]
\ [<измерение>] |,[<нзмеренне>]
3G
<обращсние к унарной компознцнн> =<символ унарной
композицпн><выраженис>
Собращенне к бинарной компознцин> =<псрвнчнос
выражениеХсимвол бинарной композиции>
<выраженпс>
Собращенне к композицин> = Совращение к унарной
композиции>| Совращение к бинарной компознцнн>
Собращенне к основной функции > =Собращение к скалярной
функцин> | Собращенне к смешанной функцин>|
Совращение к компознцни>
3.5.2. Семантика
Обращение к основной функции определяет значение,
которое получается в результате применения правил,
определяющих эту основную функцию, к аргументам
обращения.
Обращение к унарной функции изображается симво-
лом функции и аргументом, который расположен непо-
средственно справа от символа функции. Обращение
к бинарной функции изображается символом бинарной
функции и двумя аргументами, которые расположены
непосредственно слева и справа от символа функции.
Обращения к скалярным функциям определяют зна-
чения числового типа. Тип и структура значения, кото-
рое получается при обращении к смешанной функции
или композиции, определяются соответствующей смешан-
ной функцией или композицией.
В язык включено около восьмидесяти основных функ-
ций Большинство из них хорошо знакомо, так как
часто используется в процессах обработки числовой и
символьной информации. Эффективность их увеличена
тем, что их определение распространено по возможности
на векторы и многомерные массивы. Каждой функции
соответствует символ *. Основные функции разделяются
на скалярные, смешанные и композиции.
Скалярные функции предназначены для обработки
информации методами арифметики и численного анали-
за. Их аргументами являются выражения числового ти-
па. Возможность применения скалярных функций к век-
' На АПЛ-терминале число знаков, предназначенных для обо-
значения функций, меньше, чем число используемых в языке функ-
ций Поэтому для обозначения некоторых функций используются
составные символы, которые получаются наложением одного на
другого двух знаков Например, символ Ф получается наложением
вертикальной черты па кружочек В работе, для простоты, все сим-
волы функций рассматриваются как однознаковыс
37
торам и многомерным массивам позволяет осуществлять
с их помощью параллельную обработку элементарных
данных. Распространение определений скалярных функ-
ций на векторы и многомерные массивы осуществляется
по единым правилам Определения скалярных функций
приводятся ниже, в § 3.6.
Смешанные функции характеризуются возможностя-
ми определения и изменения структур значений. При их
помощи можно создавать значения с заданным вектором
размерностей, а также можно изменять порядок распо-
ложения компонент значения. Для каждой смешанной
функции существуют индивидуальные правила опреде-
ления допустимых типов и структур их аргументов. Они
описываются в § 3 7.
Композиции задают определенный порядок примене-
ния ряда скалярных и смешанных функций для выпол-
нения некоторых макродействпй. Допустимые типы и
структуры аргументов композиций определяются функ-
циями, входящими в них. Композиции рассматриваются
в § 38.
3.6. Скалярные функции
К скалярным относятся арифметические функции,
функции отношения, логические функции, нахождение
максимума, минимума и абсолютного значения, вычет,
факториал, сочетание, экспоненциальная функция, функ-
ция логарифмирования, тригонометрические функции
и др. Ниже приводится сводная таблица, в которой для
каждой скалярной функции либо даны поясняющие ее
примеры, либо устанавливается соответствие между ска-
лярной функцией и функцией из численного анализа,
либо указывается раздел, в котором содержится описа-
ние функции.
Определение некоторых сложных скалярных функ-
ций, как, например, факториал, вычет, сочетание и др,
осуществляется с помощью более простых функций. Вы-
ражения, определяющие значения этих сложных функ-
ций, следует читать, соблюдая правила вычисления вы-
ражений в АПЛ
В таблице даются определения скалярных функций
для случая, когда их аргументы являются скалярами.
Правила расширения определений этих функций на слу-
чай векторов и многомерных массивов состоят в сле-
дующем.
38
Таблица скалярных функций
Унарные функции Ct <м Ро i функ- ции Бинарные функции
Определение нлн пример | Имя функции Имя функции | Определение или пример
+ ’25= *25 Идентичность -L Сложение -2+ -3= “5
— "2^2 Изменение знака — Вычитание 5— -2s7
(—1, если В< 0 ХВэ< 0,еслиВ = 0 1 1, если В > 0 Знак чиста X Умножение 5Х ’2" -10
-r2s0,5 Обратное значение числа -Г- Деление 5 ч- -2 s -2.5
М?в Экспонента * Возведение в с.епень 9*05=3
ев
Г "3.14s ~3 Крыша г Максимум -5Г "2s -2
|_ -3.14s -4 Пол L Минимум -5L '2= -5
|В=ВГ —В Абсолютная величина 1 Вычет См. п. 3.6 1
См. п. 3.G 2 Факториал 1 Сочетание См. п. 3.6.3
® В Натуральный логарифм Логарифм А®В logAB
1п В
о
Уивриые функции
Определение или пример Имя функции
См. п 3 6 4 Случайное число
QB = BX 3.14159 Умножение на
ill О — г г НЕ
А AQB (-A)QB
0 (1-В 4: 2) 4: 5 (1 — В >fc 2) 5
1 sin В arcsin В
2 cos В arccos В
3 tgB arctg В
4 (1 + В 4: 2)4: .5 {-1 Ч- В 5k 2)4: 5
5 sh В arsh В
6 ch В arch В
7 th В arth В
Продолжение табл.
Символ фуик- Бинарные функции
ЦВИ Ими функции | Определение или пример
Вектор случайных чисел Смешанная функция. См. и 3.7.2
о Тригонометрические фупьц ш См левый н окний угол |<|б,’1ИЦЫ
А В АДВ А у В А АВ A vB
0 0 0 0 1 1
0 1 0 1 1 0
1 0 0 1 1 0
1 1 1 1 0 0
V НЕ — ИЛИ См п 3.6 5
< Меньше См п. 3.6 6
Меньше или равно См. п 3.6.6
= Равно
Не । авно я
Больше и.in равно
Больше »
1 Если аргумент скалярной унарной функции явля-
ется массивом, функция выполняется отдельно над каж-
дой компонентой массива. Если аргумент является
пустым массивом, результат функции — также пустой
массив. В общем случае результатом функции является
массив с тем же вектором размерностей, что и аргумент,
т. е. выполняется соотношение (pR) = (pRA).
2 Если оба аргумента скалярной бинарной функции
являются массивами, то функция определена только
тогда, когда векторы размерностей аргументов совпа-
дают, т. е. (pLA) = (pRA). В этом случае функция вы-
полняется покомпонентно. Вектор размерностей резуль-
тата тот же, что и вектор размерностей аргументов.
Если аргументы являются пустыми массивами, то и ре-
зультат функции — пустой массив.
3. Если один из аргументов скалярной бинарной
функции является скаляром, а другой — массивом, ска-
ляр рассматривается как фиктивный массив с тем же
вектором размерностей, что и вектор размерностей дру-
гого аргумента. Все компоненты этого фиктивного мас-
сива считаются равными значению скаляра, и функция
выполняется покомпонентно. Если схематично предста-
вить скалярную, бинарную функцию в виде SdF, где S
представляет собой скаляр, F— массив, a d — символ
бинарной функции, то результат этой функции равен ре-
зультату выражения ((pF)pS)dF.
3.6.1. Вычет
Это бинарная функция, которая определена для ве-
щественных чисел. Результатом функции AIB является
наименьшее положительное число R, такое, что для не-
которого целого S имеет место B=(R-f-AXS). Если
А=0, то В должен быть положительным числом и тогда
R*-B Определение функции может быть задано следу-
ющим образом.
। В — (| А) X LB-;-1 А, если А=Д0;
A|BsJb, если (А = 0) Д (В > 0);
I не определено, если (А=0) Д (В<0).
П р,н мер ы:
2 2 2(6 7 3.15 5 0|-13.4 1.5
0 1 1.15
1.6 1.5
41
3.6.2. Факториал
Это унарная функция, которая определена для любо-
го вещественного положительного числа В.
!В =
1, если В = 0;
ВХ(В—1)Х(В—2)Х. .Х2Х1 > если В—целое и В>0;
Г(В+1) , если В — вещественное и В>0,
где Г — гамма-функция Эйлера
3.6.3. Сочетание
Это бинарная функция, которая определена для лю-
бых вещественных положительных чисел А и В. Она
вычисляет число сочетаний из В элементов по А в каж-
дом, если А и В — целые числа и А^В. Если аргумен-
ты являются вещественными числами, то ее выполнение
равносильно выполнению функции р(А, В), где р— это
бета-функция Эйлера.
( (!В)н-(!А) Х!(В-А), если (А^0)Д(ВЭ=А) и
I А и В — целые числа;
А!В = р(А, в), если (В^= А) Д (А >0) и А, В — ве-
щественные числа;
не определена, если (А < 0) V(A> В).
3.6.4. Случайное число
Это унарная функция, которая определена для целых
положительных чисел. Она производит (выбирает) одно
псевдослучайное число из последовательности iRA Псев-
дослучайное число производится согласно равномерному
закону распределения случайных величин па основании
текущего значения целочисленной системной переменной
)PL. Значение переменной )PL меняется при каждом
выполнении функции В программе можно сохранить или
изменить значение этой переменной с помощью функции
присваивание. Рассмотрим пример:
? 6 6 6 6
15 3 1
Аргументом функции является вектор. Функция выпол-
няется над каждой компонентой вектора.
42
3.6.5. Логические функции
Скалярные функции НЕ, И, ИЛИ, НЕ—И, НЕ—ИЛИ
образуют группу логических функций. Целые числа О
и 1 рассматриваются как логические скаляры. Аргумен-
тами логических функций являются логические значе-
ния. Логические функции производят логические зна-
чения.
3.6.6. Функции отношения
Скалярные бинарные функции меньше, меньше или
равно, равно, не равно, больше или равно, и больше
образуют группу функций отношения. Аргументами этих
функций являются любые числовые значения. Кроме
того, аргументы функций равно и не равно могут быть
символьными значениями Для выполнения функции от-
ношения необходимо, чтобы оба аргумента были одного
и того же типа. Функции отношения производят логиче-
ские значения.
Так как числа в машине задаются с некоторой точ-
ностью, то для их сравнения используется системная пе-
ременная )СР, которая задает допустимую погрешность
при сравнении чисел. Ей может быть присвоено любое
значение из диапазона (0,1 [. Примеры:
) СР ♦— 0 000000001 ) СР — 0.0000001
1 = 1.0000001 1 = 1.0000001
0 1
Переменная )СР используется также и при выполнении
других функций, как, например, смешанных функций
индекс вхождения и принадлежность.
3.6.7. Скалярные функции и подтипы числовых значений
В языке не содержится явных средств для описания
подтипов (логические, целые, вещественные) числовых
переменных. Управление подтипами числовых значений
при использовании скалярных функций осуществляется
следующим образом.
1. Путем явного задания чисел и числовых векторов
в соответствующем виде (см. § 2.5 и 2.6).
2. Путем использования скалярных функций, подтип
значений которых определен заранее и не зависит от
подтипов аргументов этих функций. Например, значения
43
функций отношения и логических функций всегда имеют
логический подтип, значения функций знак числа, кры-
ша, пол, случайное число всегда имеют целый подтип,
а значения функций обратное значение числа, экспонен-
та, натуральный логарифм, умножение на л, деление,
логарифм, тригонометрических функций всегда имеют
вещественный подтип.
3. Путем анализа зависимости подтипов значений от
подтипов аргументов для скалярных функций, у которых
эта зависимость имеет место (идентичность, изменение
знака, сложение, вычитание, умножение, возведение
в степень, максимум, минимум, вычет, факториал, соче-
тание). Зависимость подтипов значений этих функций от
подтипов аргументов определяется следующими прави-
лами:
а) если аргументы имеют подтип целый, то н значе-
ние функции имеет подтип целый;
б) если хотя бы один из аргументов имеет подтип
вещественный, то и значение функции имеет тип вещест-
венный.
3.6.8. Арифметика чисел
Числа должны интерпретироваться в смысле числен-
ного анализа, т е. как объекты, описанные с присущей
им конечной точностью. Аналогично, при выполнении
некоторых скалярных функций явно подразумевается
возможность отклонения от математически вычисляемо-
го результата в пределах некоторой, зависящей от реа-
лизации, погрешности. Никакая точная арифметика не
определяется Контроль за возможными последствиями
таких отклонений от точного результата следует прово-
дить методами численного анализа. Этот контроль дол-
жен рассматриваться как часть вычислительного про-
цесса и, следовательно, выражаться в терминах самого
языка. Системная переменная )СР используется для
практической реализации такого контроля (см. п 3 6.6).
Примеры:
)РР — 6 2 5 7 -16 -8 0 1 2 313 4 5 6
1 -1 15 1 4 10 20
ЗХ1 4 6 ХЗ -.5 0 -11
3 12 18 1 -1 О 1
44
-5-1 2.5 7
1 0.4 0.142857
@10 20 30
2.30258 2.99573 3.40120
!2 3 4
2 6 24
2 2 9*2 0.5 0.5
4 1.41421 3
L5 5.5 -9.1 -.12 0.12
5 5 -10 “I 0
1 3<Е(Р111Г; РХ|
1 1
Функция пол вычисляет наибольшее целое меньше или
равное указанному аргументу. Функция крыша вычис-
ляет наименьшее целое, большее или равное указанному
аргументу.
3.7. Смешанные функции
Ниже приводятся соответственно определения сме-
шанных унарных и бинарных функций. Для каждой сме-
шанной функции дается ее наименование и схематиче-
ское изображение, которое служит для задания области
определения функции (см. § 3.1). Далее уточняется, если
необходимо, область определения функции и даются
полное определение функции и примеры.
3.7.1. Унарные смешанные функции
Структура: pF — служит для вычисления вектора
размерностей аргумента.
1 . Если RA— скаляр, то результатом функции явля-
ется пустой вектор числового типа.
2 Если RA—массив с числом измерений не мень-
ше 1, то результатом функции является вектор размер-
ностей RA Например, если RA—пустой вектор, то /?-*-,0.
Выражение рр/М вычисляет число измерений RA. При-
меры использования функции рассматриваются в п. 3 1.1.
Развертка: ,F — служит для преобразования RA
в вектор.
1. Если RA является скаляром, преобразует его в век-
тор из одной компоненты, которая равна значению ска-
ляра.
2. Если RA является вектором, оставляет его неиз-
менным.
3. Если RA является многомерным массивом, резуль-
татом функции является вектор, сформированный из
компонент массива RA и упорядоченных лексикографи-
45
чески по индексам. Примеры использования функции
рассматриваются в п 3.1 3.
Генерация индексов: tS—служит для построения по-
следовательности из RA индексов. Определение функции
и примеры даются в п. 3.1.5. Следует отметить, что зна-
чение первого индекса производимой последовательности
равно значению системной переменной )ORIGIN.
Индексация по возрастанию. V — служит для по-
строения вектора из индексов компонент вектора RA,
причем индексы упорядочены таким образом, что указы-
вают на компонент RA в порядке возрастания послед-
них. Аргумент функции имеет числовой тип Длина ре-
зультирующего вектора равняется длине RA. Таким
образом, результатом выражения RA [ RA] является
вектор, состоящий пз тех же компонент, что и RA, но
упорядоченных по возрастанию. Примеры.
*2 0 -1 0 0 -20 *(-.0)
3 2 4 5 1 @
2 0 -1 0 0 -20 2 0 -1 0 0 -20]
-20 -1 0 0 0 2
Индексация по убыванию: V — служит для выпол-
нения тех же действий, что и предыдущая операция, за
исключением того, что компоненты результирующего
вектора указывают на компоненты RA в порядке убы-
вания последних Аргумент функции имеет числовой тип.
Примеры.
1,2 0 -1 0 0 -20
1 2 4 5 3 6
2 0 -10 0 -20Ц2 0-1 0 0-20]
2000-1 -20
М’О)
Инверсия ФГ— служит для изменения порядка рас-
положения компонент аргумента на обратный. Результат
функции имеет тот же тип и вектор размерностей, что и
аргумент. Он строится из компонент RA путем измене-
ния в обратном порядке индексов последнего измерения
RA, т. е. функция выполняется по следующим правилам.
1. Если RA является скаляром, пустым массивом или
массивом, состоящим из одной компоненты, то R совпа-
дает с RA, т. е. R+-RA.
46
2. Если число измерений RA не меньше 1 и число
компонент больше 1, то R вычисляется следующим вы-
ражением к: R-*-RA [; ((pRA) [&] + 1)— i(RA) [&]],
где k — число измерений RA. Например, если предполо-
жить, что RA является трехмерным массивом, т. е. 6=3,
то R вычисляется следующим образом:
( (р/еЛ).13] + 1)-1(./?Л) [3]].
Возможна инверсия компонент массива по любому
другому измерению. Она осуществляется с помощью
композиции инверсии (см. п. 3.8.1).
Унарная транспозиция: — служит для изменения
структуры RA. Результат функции имеет тот же тип,
что и RA, и формируется следующим образом:
1 Если RA — скаляр или вектор, то R+-RA.
2 Если RA — матрица, то R является матрицей, рав-
ной транспонированной матрице RA.
3. Если RA — массив с числом измерений больше 2,
то R является массивом с тем же числом измерений, что
и RA. Компоненты вектора размерностей R, кроме двух
последних, совпадают с компонентами вектора размер-
ностей RA Предпоследняя компонента вектора размер-
ностей R равняется последней компоненте вектора раз-
мерностей RA, а последняя компонента вектора размер-
ностей R равняется предпоследней компоненте вектора
размерностей RA. Соответственно переставляются (транс-
понируются по двум последним координатам) и компо-
ненты массива RA Напрпмер, если предположить, что
RA является трехмерным массивом, то компоненты R
вычисляются выражением R[/,J;N]-*-RA
Возможна транспозиция по любым двум измерениям
массива Она осуществляется с помощью бинарной
транспозиции (см. п. 3 7 2)_
Обращение матрицы. 1Т|Л/—служит для вычисления
значения, обратного RA. Аргумент функции имеет число-
вой тип. Функция выполняется по следующим правилам.
1. Если RA — скаляр, то R*—i-R.
2. Если RA — вектор, то R также вектор с числом
компонент, равным числу компонент RA. Причем ска-
лярное произведение этих двух векторов равняется 1.
3. Если RA — матрица, то она должна быть обрати-
мой; число строк должно совпадать с числом столбцов
* Символы . не являются составными частями выражения
Здесь и в дальнейшем они используются для указания периодиче-
ского повторения предшествующего символа или группы символов.
47
матрицы и ее определитель должен быть отличным от
нуля. В этом случае результатом функции является мат-
рица, обратная матрице RA Если RA не квадратная
матрица, то функция вычисляет левую обратную матри-
цу матрицы RA. Пример:
А «- 3 Зр4 603221 34
-0 3846I5E-• 0 461538 -0 230769
0.192307 -0.307692 0.153846
-0.134615 0.115385 0.192307
Выполнить: О V — служит для интерпретации после-
довательности символов, указанной аргументом как
АПЛ-выражение; И — символьный вектор (или выраже-
ние, значением которого является символьный одномер-
ный массив). Функция выполняется следующим обра-
зом. Последовательность символов рассматривается как
АПЛ-выражение и выполняется. Результат этого выра-
жения является результатом функции. Пример:
А <- ’6 + i6’
°’ -1 +’, А
6 7 8 9 10 11
А«-’5’
2’-i + ’, А
Так как переменная А принимает различные значе-
ния, то одно и то же выражение даст различные резуль-
таты.
3.7.2. Смешанные бинарные функции
Перестройка: VpF— служит для создания нового
массива; 17 представляет собой целое неотрицательное
число, пустой вектор чисел или вектор целых неотрица-
тельных чисел, a F— любое значение, кроме пустого
массива
Результат функции является массивом того же типа,
что и RA и с вектором размерностей (,£А), т. е. резуль-
татом функции является массив с (р,£Д) измерениями.
Соответственно каждая компонента этого массива оп-
ределяется набором из (р,£А) индексов. Результат
функции формируется из компонент вектора (,/?А) сле-
дующим образом:
1. Если LA — пустой вектор, то R*-(,RA) (1].
48
2. Если LA — пуль или вектор, который содержит
хотя бы одну компоненту, равную нулю, то R является
пустым массивом с вектором размерностей (,LA).
3. Если LA— отличное от нуля число или вектор,
у которого ни одна компонента не равняется нулю, то
из компонент вектора (,RA) формируется последователь-
ность компонент, длина которой определяется произве-
дением компонент вектора (,LA), т. е. выражением
(X/.LX). Она будет представлять собой последователь-
ность компонент массива R, полученную согласно лекси-
кографическому изменению индексов этого массива, т. е.
(,R).
Эта последовательность формируется следующим об-
разом:
если (p,RA) = (X/LA), то (,RA) и есть нужная по-
следовательность;
если (р,7?Д) > (Х/LA), то в последовательность вхо-
дят только первые (X./LA) компоненты вектора (,RA)t
если (p,RA) < (Х/LA), то при формировании выше-
упомянутой последовательности компоненты (,RA) цик-
лически повторяются
Рассмотрим, например, порядок вычисления R в слу-
чае, когда LA является вектором из трех компонент
Следовательно, R будет трехмерным массивом
если ((р,/?Л)|^+£Д131Х(/-1)+М[2)Х/-1)=^0, то
/?[/;J;yV)*-(,/?4)l(p,/?4)|yV+M[3)X(/-l) + LA [2] X
X/—1 иначе 7? (/,/,/У]*-(,7?Д) [р,7?Д].
Очевидно, что для других LA результат функции вы-
числяется аналогичным образом.
В п. 3.1.2 был рассмотрен ряд простых примеров ис-
пользования функции перестройка. Рассмотрим более
сложные примеры.
(tO) р 1.5
1 5
Левый аргумент является пустым вектором, результат —
скаляр.
3 0 1р’Г
@
Левый аргумент содержит нулевую компоненту, резуль-
тат— пустой трехмерный массив.
Индекс вхождения ViF—служит для построения чис-
лового массива с тем же вектором размерностей, что и
RA. Каждая компонента этого массива равна индексу
вхождения соответствующей компоненты RA в LA\ V
4—265 49
представляет собой произвольный вектор, a F— любое
значение, кроме пустого массива. Аргументы должны
быть одного и того же типа.
Если компонента RA входит несколько раз в LA, то
соответствующая компонента R равняется индексу само-
го левого вхождения компоненты RA в LA. Если компо-
нента RA не входит в LA, то соответствующая компо-
нента R равняется значению выражения (p£A)-f-l).
Примеры.
2 2 3 i 2 3 5 7
13 4 4
(! 0) tP
1111
’XYZABHK’ tX
4 5 8 8
8 8 8 6
8 8 7 8
В приведенных примерах не все компоненты правого
аргумента входят в левый аргумент.
Принадлежность: F — служит для построения
логического массива с тем же вектором размерностей,
что и LA; F представляет собой любое значение, a G —
любое значение, кроме пустого массива. Аргументы
должны быть одинакового типа. Компонента R равня-
ется 1, если соответствующая компонента LA входит
в RA. В противном случае она равняется 0. Примеры:
Хе’XYZABHK’
110 0
0 0 0 0
0 0 10
PS (I 0)
0 0 0 0
Выборка: V]F — служит для выборки подмассива из
RA. Компоненты LA указывают те индексы измерений
RA, которые используются при выборке; V представляет
собой любое целое число или вектор целых чисел. Ре-
зультат функции имеет тот же тип, что и RA.
1. Если RA — скаляр или вектор, то LA должен быть
числом. R является вектором из (<ЕА) компонент и вы-
числяется следующим образом:
если LA=G, то R является пустым вектором;
если (£А>0)Л(£А^р,/?А), то R является вектором
из первых LA компонент вектора (,/?А), т. е.
R^(,RA) [НА];
если (£А<0)Л(‘|£А)^р,/?А), то R является векто-
ром, состоящим из последних (|£А) компонент вектора
(,RA), т. е. R^(,RA) [((p,/?A)-f-£A) + i НА].
50
При (l£A)>p,/?A результат функции содержит боль-
ше компонент, чем RA. Дополнительные компоненты R
приравниваются нулю, если RA является числовым зна-
чением, и символу <пробел>, если RA является сим-
вольным значением. Если LA>0, то дополнительные
компоненты R располагаются после компонент RA,
а если LA <0, то перед ними Пример ы:
-з t Р -6 Т ’ABCD’
3 5 7 । и iABCD
6 t Р 01 Р
2 3 5 7 0 0 @
2. Если (рр/?А) > 1, то LA должен быть вектором и
должен содержать (рр/М) компонент. Каждая компо-
нента LA указывает, какие индексы соответствующего
измерения RA используются при выборе подмассива.
А именно-
если LA [А] >0, то для индексирования по &-му изме-
рению RA используются индексы i£A]A],
если (LA ]А] <0)А(|£А (А]) ^р/М [/г], то для индек-
сирования по А-му измерению используются индексы
((р/?А) {k\+LA{k])+t}LA [А];
если LA (А] =0, то для индексирования индексы не
используются, а результирующий массив является
пустым массивом.
Вектор размерностей результирующего массива вы-
числяется выражением {\LA). Результат функции полу-
чается путем индексирования RA описанным выше спо-
собом.
Рассмотрим, например, выполнение следующего об-
ращения к функции выборки 2 ~2fE Результат функ-
ции вычисляется выражением Е [t2; ((рЕ) [2]-р-2)+
+112_2 [2] ]. После вычисления индексных выражении
данное выражение принимает вид- Е]1 2; 3 4]. Таким
образом, в результате выполнения 2 ~2|Е выбирается
подмассив, который состоит из компонент матрицы Е.
находящихся на пересечении первой и второй строки
с третьим и четвертым столбцами.
2 -2 | Е
13 14
23 24
4*
51
Если какая-либо компонента LA по абсолютной вели-
чине больше, чем размерность соответствующего измере-
ния RA, то соответствующие дополнительные компонен-
ты R приравниваются нулю, когда RA является число-
вым значением и приравниваются символу <пробел>,
когда RA является символьным значением. Примеры:
2 -5ТЕ 4 4JX
О 11 12 13 14 A BCD
О 21 22 23 24 EFGH
1 J К L
I I. IL И—I
Вычеркивание- — служит для выборки подмас-
сива из RA вычеркиванием некоторых его компонент.
Левый аргумент указывает индексы измерений RA, ко-
торые вычеркиваются при этом выборе. Вычеркивание
индексов означает и вычеркивание соответствующих
компонент правого аргумента. Символ V представляет
собой целое число или вектор целых чисел. Результат
функции имеет тот же тип, что и RA. Он состоит из тех
компонент RA, индексы которых не вычеркнуты. Его
вектор размерностей имеет ту же длину, что и (,АД), и
вычисляется следующим образом если ([ LA) [/г] <
< (р/?Л) [Аг], то /г-я компонента вектора размерностей R
равна значению выражения (р/?Д) [Аг] — tLAlk], иначе —
нулю.
Результат функции вычисляется по следующим пра-
вилам
1. Если RA скаляр или вектор, то LA должен быть
целым числом. В этом случае, при (> LA) (p,RA) ре-
зультат является пустым вектором, а при (iZ.4) <
<(p,RA)R вычисляется следующим образом:
если LA=Q, то R+-RA;
если LA>0, то R является вектором, состоящим из
последних ((р,^Д)—LA) компонент вектора (,RA), т. е.
R+-(,RA) [LA+i((p,RA)-LA)},
если LA<zO, то R является вектором, состоящим из
первых ((р,/М) — iLA) компонент вектора (,/?Л), т. е.
/?-*-(,RA) [i((p,/M)~LA)l. Пример ы:
Ц15 I 01 'А 4- В;
0
52
А + В
2. Если (рр/?Л) > 1, то должно выполняться отноше-
ние (р£Л) = (рр£Л); /г-я компонента LA указывает, ка-
кие индексы вычеркиваются из /г-го измерения RA.
Вычеркивание индексов означает и вычеркивание соот-
ветствующих компонент RA. Результат функции пред-
ставляет собой подмассив /?Л, который остается после
вычеркивания. Очевидно, что при вычеркивании всех
индексов какого-либо измерения результатом функции
является пустой массив.
Вычеркивание индексов /г-го измерения RA выполня-
ется так:
если LA [/г] =0, то вычеркивание не происходит;
если LA [/г] >0, то вычеркиваются начальные LA [/г]
индексы Лг-го измерения;
если LA[k]<0, то вычеркиваются последние )LA[kj
индексы Лг-го измерения.
Примеры.
2 -ЦЕ I 5 2{Х
.31 32 33 | @
Конкатенация: G,F — описана частично в п. 3 1.4.
Оба аргумента функции должны быть одного и того же
типа. Ниже приводится полное определение функции
1. Если LA и RA — скаляры или векторы, то функ-
ция строит новый вектор путем конкатенации LA с RA.
Длина результирующего вектора равна сумме длин век-
торов (,ЬА) и (,#Л).
2. Если LA и RA — массивы более чем с одним изме-
рением, то они должны иметь одинаковое число измере-
ний, а компоненты их векторов размерностей, кроме по-
следней компоненты, должны совпадать. В этом случае
функция создает новый массив путем конкатенации LA
и RA по индексам последних измерений. Вектор размер-
ностей R вычисляется выражением
(~1|р£Л), (р£Л) [рр£Л] + (р/?Л) [рр/?Л] •
Результат функции вычисляется следующим образом:
/?[;.. ; г(р£Л) [рр£Л]]ч-£Д
и ;(р£Л) [рр£Л] +i(p/M) [рр/?Л ]]-*-/? Л.
Пусть, например, LA и RA — трехмерные массивы, тог-
да компоненты R вычисляются следующим образом:
если (1 ^N) Л (N^ (pLA) [рр£Л], то
R(I;J,N]+-LA[I,J‘,N]; ,
53
если (N> (pLA) [ррАД] )A(N^.(pLA) [ррАД] -f-
+ (р/?Д){рр/М], то R[I ,J,N]+-RA (pLA) [ррЛЛ]].
3. Если один из аргументов является массивом более
чем с одним измерением, а другой — скаляром, то при
выполнении функции скаляр рассматривается как фик-
тивный массив с тем же числом измерений, что и число
измерений другого аргумента Все компоненты вектора
размерностей этого фиктивного массива, кроме послед-
ней, считаются равными соответствующим компонентам
вектора размерностей другого аргумента. Размерность
последнего измерения полагается равной 1. Значения
компонент фиктивного массива считаются равными зна-
чению скаляра. Дальнейший порядок вычисления ре-
зультата тот же, что и в предыдущем случае
Возможна конкатенация массивов по любым измере-
ниям. Она осуществляется с помощью композиции кон-
катенация (см. п. 3.8.2).
В п. 3 14 приведен ряд простых примеров конкате-
нации. Рассмотрим более сложные примеры.
Х,(3 2р* 123456’)
A BCD 12
Е FGH 34
1 J К L 56
Выполнена конкатенация матрицы X (вектор размерностей 3 4)
с матрицей, созданной функцией перестройка (вектор размерностей
3 2) Результатом является матрица с вектором размерностей 3 6
(3 0р1 3),(3 2р 21)
21 21 21
21 21 21
Выполнена конкатенация пустого двумерного массива с другим не-
пустым мерным массивом
Сжатие U/F — служит для выборки подмассива из
массива RA. Какие именно RA должны включаться в ре-
зультирующий подмассив, указывает LA. Функция вы-
полняется по следующим правилам-
1. Если RA — пустой массив, то R+-RA.
2. Если RA — скаляр, то LA должен быть логическим
скаляром.
В этом случае при LA=0, R — пустой вектор, а при
LA = l результат функции является вектором из одной
компоненты, которая равна значению скаляра. П р н-
м е р ы:
1/1.5 I 0,1.5
I @
1 5
54
3. Если (рр/?Д)^1, то LA может быть логическим
скаляром или вектором. Если LA — вектор, то необхо-
димо, чтобы выполнялось соотношение (рАД) =
= (р/?Д) [рр/М]. В этом случае R является массивом
с тем же числом измерений, что и RA. Компоненты век-
тора размерностей R, кроме последней, равны соответ-
ствующим компонентам вектора размерностей RA. По-
следняя компонента вектора размерностей R равна чис-
лу содержащихся в LA единиц. Таким образом, вектор
размерностей R вычисляется выражением (~1| (р/М),4~
4-/4/). Компонента массива RA входит в R тогда и толь-
ко тогда, когда компонента LA, индекс которой равня-
ется последнему индексу компоненты RA, равняется 1.
Например, если RA является трехмерным массивом, то
RA входит в R тогда и только тогда, когда
АД[ДГ]=1. Примеры:
0 10 1/2 3 5 7
3 7
1 0 0 1/Х
AD
ЕН
I L
Если LA является логическим скаляром, то при вы-
полнении функции LA рассматривается как фиктивный
вектор ((р/М) [рр/М] рАД) и R вычисляется по указан-
ным выше правилам. Примеры.
1/Р I 0/Q
2 3 5 7 | @
Возможно сжатие массива по любому его измерению.
Оно осуществляется посредством композиции сжатия
(см. п 3.8 2)
Расширение: U\F — служит для построения нового
массива путем вставления между компонентами RA но-
вых компонент. Место вставления новых компонент ука-
зывается посредством LA; U представляет собой про-
извольный логический вектор или скаляр Функция вы-
полняется по следующим правилам.
1 Если RA является пустым вектором, то LA должен
состоять только из нулей; R — вектор, состоящий из
(р.АД) компонент Все компоненты R равны нулю, когда
RA — пустой числовой вектор и равны символу
<пробел>, когда RA — пустой символьный вектор.
55
Примеры’
О О О ч (tO)
ООО
О О О\”
2 Если RA является скаляром, то только одна ком-
понента LA должна быть равна единице; R — вектор из
pLA компонент. Компоненты вектора R, кроме той, ко-
торая соответствует компоненте вектора LA, равной 1,
равны 0, когда RA—значение числового типа, и равны
символу <пробел>, когда RA — значение символьного
типа. Компонента R, соответствующая компоненте LA,
равной 1, равняется значению скаляра. Примеры
1\1.5 I 0 0 1 0\1.5
1.5 | 0 0 1.5 О
3. Если (рр/М)^1, то аргументы считаются подхо-
дящими, когда выполняется отношение (р#Д)[рр#4] =
=+/LA, т. е. LA должен содержать столько единиц,
сколько позиций содержит последнее измерение RA.
В этом случае R является массивом с тем же числом
измерений, что и RA. Измерения R, кроме последнего,
имеют тс же размерности, что и соответствующие изме-
рения RA. Последнее измерение R содержит (р,А4)
позиций; R формируется из компонент RA и, в зависи-
мости от типа RA, из нулей или пробелов. (Дополни-
тельные компоненты R равны 0, когда RA — значение
числового типа, и равны символу <пробел>, когда
RA — значение символьного типа) R строится согласно
следующим правилам
компоненты R вычисляются согласно лексикограф/-
ческому порядку изменения индексов;
компонента R приравнивается нулю (или символу
<пробел>), когда компонента LA, индекс которой ра-
вен последнему индексу компоненты R, равна нулю.
Если эта компонента LA равняется 1, то компонента R
приравнивается очередной компоненте RA. Например,
если предположить, что RA является трехмерным число-
вым массивом, то компоненты R вычисляются следую-
щим образом
R [/; /; jV]*-0, если LA[N}=0 и
Rtf; J- N\*-RA[I- J-, +IN | LA], если LA [AZ] = 1.
56
Примеры:
1 0 0 1 0 1 О 1\Р
20030507
11101\Х
ABCljD
EFGl-jH
I JKi—iL.
4. Если RA — пустой массив, то он должен быть та-
ким, что только последняя компонента его вектора раз-
мерностей равна нулю, a LA должен состоять только из
нулей, R вычисляется как в предыдущем случае. П р и-
м е р-
О 0\(2 0р1,5)
О О
О О
Возможно расширение массивов по любому измере-
нию. Ойо осуществляется с помощью композиции рас-
ширения (см. п. 3 8 2).
Вращение- GQ)F — служит для построения нового
массива из компонент RA путем их вращения. Направ-
ление и число шагов вращения указываются с помощью
LA, G — целочисленное значение. Функция выполняется
по следующим правилам-
1. Если RA является скаляром, вектором, состоящим
из одной компоненты, или пустым вектором, то LA дол-
жен быть числом. В этом случае R-^RA.
2 Если RA — вектор, содержащий более чем одну
компоненту, то LA должен быть целым числом; R вы-
числяется следующим образом, а) если LA=Q, то
R+-RA; б) если ЛА=#=0, то R — вектор, который получа-
ется в результате вращения компонент RA против часо-
вой стрелки при АА>0 и по часовой стрелке при
£А<0на (|£А) позиций, т. е
/? [/]-*-/?А [ (р/?А) । /Ч-АА], если ((pRA) । ?+ВА) =#=0 и
R [/]*-/? А [р/?А], если ((р/?А) |/-j-LA)=O.
Примеры:
ЗфР -6фР
7235 5723
3. Если RA — массив более чем с одним измерением,
то LA может быть отдельным числом или массивом. Ре-
зультатом функции является массив того же типа и с тем
57
же вектором размерностей, что и RA. Он получается
в результате вращения компонент RA по последнему
измерению на количестве позиций и в направлении, ко-
торые определяются LA. Возможны два случая:
a) LA — число; тогда если RA — пустой массив, то
R+-RA, если RA — непустой массив, то его компоненты
вращаются по последнему измерению на (,£4) позиций
так, как это описано в п. 2,
б) LA — массив. Аргументы функции в этом случае
должны удовлетворять отношению (рАА) = (~1|р/?А);
тогда если RA — пустой массив, то R+-RA, если RA —
непустой массив, то результат функции получается путем
вращения компонент RA по последнему измерению для
каждого фиксированного набора индексов остальных
измерений на величину и направление, определяемые
компонентой массива LA с этим набором индексов На-
пример, если RA—трехмерный массив, то LA должен
быть двумерным массивом. Каждая компонента LA [/,/]
указывает число позиций и направление вращения ком-
понент RA с /-м первым и /-м вторым индексом, т. е.
R вычисляется по выражению
R \l',J,\+-RA [IJ, (LA [/;/] ф i(p/?A) [3])].
Аналогичное выражение легко написать для случая,
когда RA является любым непустым многомерным мас-
сивом и LA и RA удовлетворяют вышеупомянутому от-
ношению. Примеры. -2 0 1фХ
ЗфЕ
12 13 14 11 CDAB
22 23 24 21 EFGH
32 33 34 31 J KLI
Возможио вращение компонент массива по любому
его измерению. Ойо осуществляется посредством компо-
зиции вращения (см. п. 3.8.2).
Бинарная транспозиция; VQF — служит для транс-
понирования любых измерений RA и также позволяет
выбрать подмассив массива RA Левый операнд LA ука-
зывает, какие измерения RA транспонируются. Правый
аргумент представляет собой непустой массив с числом
измерений больше 1, левый — вектор целых положитель-
ных чисел, который содержит хотя бы одну компоненту,
равную 1. Кроме того, компоненты вектора LA должны
58
быть подобраны определенным образом, а именно: если
LA содержит хотя бы одну компоненту, равную п, то
должен обязательно содержать и компоненту, равную
(п—1), некоторые или все компоненты LA могут совпа-
дать. (Например, если RA является трехмерным масси-
вом, то допустимыми левыми аргументами функции яв-
ляются векторы: 12 3; 3 12; 2 13; 112; 111
и др Векторы 1 3 3; 2 3 3; 2 2 2 и др.— недопустимы )
Функция выполняется по следующим правилам.
1. Если все компоненты LA различны, то аргументы
функции считаются подходящими, если удовлетворяют
отношению (р£Л) = (рр/?Д) и транспонирование осуще-
ствляется следующим образом-
а) с помощью выражения (р^Л) [LA\ вычисляется
вектор размерностей результирующего массива;
б) вычисляются компоненты результирующего масси-
ва. Для вычисления произвольной компоненты R исполь-
зуется соответствующий ей набор индексов. Из этого
набора формируется новый, который используется дтч
указания соответствующей компоненты RA. Какой имен-
но индекс из исходного набора будет на А-м месте в но-
вом наборе, указывает A-я компонента вектора LA (k по-
лучает значения от 1 до pLA).
Рассмотрим, например, выполнение выражения
2 1 Q X:
а) (РЛ”)|2 1]=(3 4)12 1]=4 3
б) /?|7; /] -*[(7, /)(АЛ[1]|; (J, I)\LA |2]/]
R\h 1\~-Х |(/. /) [2|; (7, /)|1]|^
/?|7; /] — Х|/; 7].
Как видно, 2 1 Q X Аналогично можно убе-
диться, что 1 3 2 Q Q==QQ.
2. Если среди компонент LA есть равные, то число
измерений результирующего массива меньше числа из-
мерений RA. Оно вычисляется выражением Г/LA.
В этом случае результат функции также вычисляется за
два шага.
а) если обозначить через С вектор размерностей ре-
зультирующего массива, то его k-я компонента вычис-
ляется выражением [_ /(k=LA)/pRA;
б) компоненты R вычисляются, как и в предыдущем
случае.
59
Например, если предположить, что RA—трехмерный
массив и LA содержит две равные компоненты, то ре-
зультатом функции является двумерный массив и его
компоненты вычисляются выражением
R[J;I]RA[(J,/)[LA[1]]; (J,/)[LA[2] ];(/,/) [АА[3]]].
Рассмотрим подробно выполнение выражения
1 2 1 QQ Число измерений R вычисляется выражением
Г/1 2 1 и равно 2.
а) С[1]ч-[_/(1 = 1 2 l)/pQ=C[l]^-2
С(2]*-|_/(2=1 2 l)/pQ=C[2]*-3.
Вектором размерностей R является вектор 2 3.
б) компоненты R вычисляются с помощью выраже-
ния, указанного выше:
/?[1; 1]«—Q[l; 1; 1]
R |1; 2| — Q [I ; 2; 1]
R |1; 3] Q [1; 3; 1]
/?[2; 1] — Q [2; 1; 2]
/?|2; 2] <- Q |2; 2; 2]
R |2; 3]-(-Q12; 3; 2]
Очевидно, что алгоритм вычисления функции, опи-
санный во втором случае, может быть использован и для
таких LA, которые не содержат равных компонент. Та-
ким образом, он полностью определяет функцию.
Вектор случайных чисел- S^Sl — служит для построе-
ния вектора целых положительных чисел, которые вы-
бираются случайным образом (согласно равномерному
закону распределения случайных величин) без повторе-
ния из сегмента целых чисел ; S и S1 должны
удовлетворять отношения (S^Sl) и (S>0). Результат
функции содержит LA компонент Пример:
з?б I з>д
15 3 |421
Кодирование: VTS — служит для преобразования
десятичного представления числа RA в его представле-
ние в позиционной системе счисления, основание кото-
рой указывается левым аргументом. Это преобразование
осуществляется по известному алгоритму перевода це-
лых десятичных чисел в другую позиционную систему
счисления; V представляет собой целое положительное
число или вектор целых положительных чисел. Резуль-
татом функции является вектор чисел, представляющий
собой перекодированное представление числа. Каждая
60
позиция этого вектора содержит одну цифру представ-
ления числа в новой системе счисления Длина резуль-
тирующего вектора равняется длине LA, если LA— век-
тор, или числу цифр представления числа в новой систе-
ме счисления, если LA — скаляр. В случае, когда
количество позиций, указанное вектором LA, больше,
чем необходимо для размещения представления числа
в новой системе счисления, это представление занимает
последние компоненты вектора R. Остальные компонен-
ты R равняются 0 Примеры:
3 3 3 3 3 3 29 Ю Т 29
0 0 10 0 2 2 9
Если количество позиций, указанное вектором LA,
меньше, чем необходимо для размещения полного пред-
ставления числа в новой системе счисления, то R вычис-
ляется по следующим правилам.
1. Если £Д[1]=0, то R [ 1 ] является неперекодиро-
ванным остатком числа, а остальные компоненты R
представляют перекодированную часть числа. При-
меры:
О 2 у 5
2 1
0 10 10 Т 342
34 2 5
2. Если LA [ 1] =#=0, то R является только частью пред-
ставления числа RA в новой системе счисления При-
меры-
2 2Т5 I 0 24 60 60Т1254056
01 | 14 12 20 56
Во втором поимере компоненты LA различны В этом
случае LA указывает основу смешанной системы счис-
ления. Например, функция кодирования используется
для выражения количества секунд в минутах, часах и
сутках. Таким образом, 1254056 — это 14 суток, 12 ч.,
20 мин н 56 с.
Декодирование: V.LV1— служит для выполнения
действия, обратного действию функции кодирования; V
и VI — целые скаляры или векторы; LA указывает осно-
вание системы счисления; RA представляет собой пред-
ставление числа в системе счисления, основание которой
задано вектором LA. Результат функции вычисляется
следующим образом-
61
1. Если LA н RA — векторы, то необходимо, чтобы
имело место отношение (р£Д) = (рРД), т е. они долж-
ны быть одинаковой длины. В этом случае результат
функции вычисляется по следующим правилам:
а) по вектору LA строится весовой вектор W той же
длины, что и LA:
W [р£Д] — 1
W |(р£А) - 11 - LA [р£Д 1 X W 1р£Д|
W 1(р£Д) - 2| — LA \(9LA) - 1JXW [(р£Д) -1|
W[l|-LA |21 X W|2|;
б) вычисляется результат функции с помощью выра-
жения —h/WX^. Заметим, что компонента LA [1]
не участвует в вычислении R и, следовательно, может
быть любым числом *.
Рассмотрим подробнее выполнение следующего обра-
щения к функции декодирования- 0 24 60 60 ± 14 12
20 57. Вектор 14 12 20 57 является представлением не-
которой величины в смешанной системе счисления с век-
тором основания 0 24 60 60. Вычисленный весовой век-
тор следующий: 86400 3600 60 1. Следовательно, выра-
жение +/86400 3600 60 1X14 12 20 57 вычисляет ре-
зультат функции, т. е +/86400 3600 60 1X14 12 20 57
Х+/1209600 43200 1200 57=1254057. Примеры.
2J_0 I 0 1
5
10 10 10J_5
555
Деление матриц Л1|—— служит для выполнения
операции деления матриц. Она реализуется с помощью
операции умножения матриц обратная матрица правого
операнда умножается на матрицу, представленную ле-
вым операндом Л4 и Ml — произвольные числовые ска-
ляры, векторы или матрицы.
- В последних реализациях языка АПЛ возможности функций
декодирования н кодирования были расширены для случаев, когда
LA и RA являются многомерными массивами [6]
62
Если LA и RA— скаляры, то LA |—|/?Д ^LA-^-RA,
в остальных случаях LA |/?А = (|— |/?Д) + -Х£Д (см
п. 3.8.2), т. е. если, например, LA и RA — матрицы, то
их деление интерпретируется как матричное произведе-
ние матрицы, обратной RA, с матрицей LA. Очевидно,
что для того, чтобы функция была определена, необхо-
димо, чтобы структуры матриц LA и |—|/?Д были таки-
ми, чтобы их произведение было определено.
3.8. Композиции
3.8.1. Унарные композиции
Редукция — служит для определения порядка выпол-
нения скалярной бинарной функции d над компонента-
ми RA по его &-му измерению Ее частичное определе-
ние дано в п. 3 1 6. Этой композиции соответствует схе-
матическое изображение d[k\F или d/F, где d — символ
скалярной бинарной функции, F—числовое значение,
k — порядковый помер измерения RA. Если она имеет
схематическое изображение d/F, это означает, что опре-
делена над компонентами RA по его последнему изме-
рению, т. е. d//?A = d/[pp/?A]7?A Редукция выполня-
ется по следующим правилам:
1. Если RA —скаляр, то R^-RA
2. Если RA — пустой массив, то результатом редук-
ции является единичный элемент функции (если он су-
ществует).
Под единичным элементом скалярной бинарной
функции понимается такое значение одного из ее аргу-
ментов, которое определяет значение функции равным
значению другого аргумента (при любых допустимых
значениях последнего). Например, единичный элемент
функции сложения равен 0, т е А+0=0+А=А. Еди-
ничный элемент может быть определен только с одной
стороны, справа или слева Например, единичный эле-
мент функции вычитания определен только справа, т. е
А—0=А, но 0—А^А
Ниже приводится таблица скалярных бинарных функ-
ций, для которых определен единичный элемент:
3. Если RA — непустой вектор, то R вычисляется
выражением R^-RA [ 1 ] dRA [2]d.. . dRA [ (p/?A) —
-l]d/?A [p/?A].
63
Л- Символ функции Единич- ный элемент к« Симтол функции Едннпч НЫ'1 элемент Символ функции Единич- ный элемент
1 0 5 * 1 9 Л 1
2 — 0 6 г 1 10 V 0
3 X 1 7 L 1 11 А 0
4 -Г- 1 8 1 0 12 V 1
В таблице I — наименьшее число, представляемое
в машине; у — наибольшее число, представляемое в ма-
шине.
4. Если RA — непустой массив с числом измерений
большим 1, то R—массив с числом измерений, на еди-
ницу меньшим числа измерений RA. Вектор размерно-
стей R вычисляется выражением (р/?Д) [(t&—1)Л+
Н-1(рр/?Д)—Л].
При вычислении R из RA выбираются последователь-
ности компонент таким образом, что набор индексов
каждой компоненты отличается только по &-му индексу.
К компонентам каждой последовательности применяется
функция d так же, как описано в предыдущем случае.
Вычисленные числа являются компонентами R. Им со-
ответствуют наборы индексов, составленные из индексов
первой компоненты последовательности, но без k-ro ин-
декса Например, предположим, что RA — трехмерный
массив и рассмотрим выполнение редукции по второму
измерению RA. Вектор размерностей R вычисляется вы-
ражением (р/?Л) [(il),2+t3—2], т. е. R является матри-
цей, состоящей из (р/?Д) [1] строк и (р/?Д) [3] столбцов.
Компоненты R вычисляются выражением /?[/;/]-«-
^d/RA [/;1(р/?Д) [2] ,J]. Примеры
X/V0)
1
ФЧ’О)
о
Г/Е или Г/[2] Е
14 24 34
Г/1ПЕ
31 32 33
Инверсия: ф [Л] F — является обобщением смешанной
функции инверсии (см. п. 3.7.1); F представляет собой
произвольный массив с числом измерений не меньшим 1;
k — порядковый номер измерения RA\ R — это массив,
который получается из массива RA инверсированием
компонент последнего по &-му измерению. Очевидно, что
(Т) [рр/?Д]7?Д = (Т)7?Д. Примеры.
64
CD PI X
I JKL
EFGH
ABCD
Ф |2] X
DCBA
H'FE
LKJI
3.8.2. Бинарные композиции
Внутреннее произведение. Mf,dMl— является обоб-
щением операции матричного произведения из линейной
алгебры, М и Ml — числовые значения, f и d— символы
скалярных бинарных функций. Композиция вычисляет
значение по правилам, аналогичным правилам матрич-
ного умножения В частности, если LA и RA — матрицы,
то £Д+ XRA выражает умножение матрицы LA на мат-
рицу RA. Вектор размерностей R вычисляется выраже-
нием (-1|р£Д),( Цр/?Д). Ниже приводятся правила,
определяющие композицию
1. Если оба аргумента являются скалярами, компо-
зиция не определена.
2. Вычисление R, когда аргументы являются векто-
рами или матрицами, приводится в следующей таблице:
LA RA Отношение, которое ДОЛЖНО ВЫПОЛНЯТЬСЯ BbriHc.ieinie R PpR
Вектор Вектор (pLA)=pRA R«- f,/LAdRA 0
Вектор Матрица (pLA) = 1 t ?RA R[I]<-f/LAdRA[,lj 1
Матрица Вектор (~l]pLA)=pRA R [/]«- f/LA [/;\dRA 1
Матрица Матрица (-If pM) = l t pRA «- f/LA [/;]dRA [;J ] 2
3. Если один из аргументов является скаляром,
а другой вектором или матрицей, то определение компо-
зиции задается следующей таблицей
LA RA Вычисление R ppR
Скаляр Вектор R<-f/LAdRA 0
Вектор Скаляр R<-f/LAiRA 0
Скаляр Матрица Rll]+- ^f/((-l I pRA)pLA)dRA[; /] (Р/?Я) [2] 1
Матрица Скаляр <-f/LAf/,ld(-ltpLA)pRA (рЫ)(Ц 1
5—265
65
Определим следующие переменные:
А —4 4 5
В*—4 3p(tl0)
С«—3 4р(8 — i7)
Примеры:
3+-ХВ
•66 48 60
А+ . = А
I0+.X1 2 3
-60
Cl. — В
0 0 2
1 0 1
-0 2 0
в+.хс
31 25 19 30
79 54 49 65
127 103 79 111
85 72 59 53
CL-ГВ
6 4 4
3 3 3
5 3 3
Внешнее произведение: Go.dF — служит для выпол-
нения функции d над всеми парами компонент, причем
первая компонента пары берется из LA, вторая — из RA;
G и F представляют собой произвольные числовые зна-
чения, d — символ скалярной бинарной функции, О —
разделитель.
Результатом композиции является массив чисел, ко-
торый получается в результате взаимодействия (в зави-
симости от d) каждой компоненты LA с каждой компо-
нентой RA. Вектор размерностей R вычисляется выра-
жением ((р£А),(р/?А)); R вычисляется следующим
образом:
1. Если одни из аргументов является скаляром, а дру-
гой— массивом, то композиция выполняется как ска-
лярная бинарная функция d.
2. Если оба аргумента являются массивами с числом
измерений, не меньшим единицы, то R получается вы-
полнением функции d для всех пар компонент — по од-
ной от LA и RA, а набор индексов результата получает-
-66
ся приписыванием индексов компоненты RA к индексам
компоненты LA. Примеры-
20. — >4
10-1-2
(‘3)0 < (>3)
1 1 1
О 1 1
О О 1
Конкатенация: G, [&]F — является обобщением сме-
шанной бинарной функции конкатенация на случаи, когда
конкатенация осуществляется по произвольным изме-
рениям аргументов (см. п. 3.7.2). Символы G и F пред-
ставляют собой скаляры или массивы с числом измере-
ний, не меньшим единицы, k — порядковый номер изме-
рения, по которому осуществляется конкатенация.
Оба аргумента операции должны быть одного и того
же типа. Кроме этого, если оба аргумента являются мас-
сивами, то они должны иметь одинаковое число измере-
ний и компоненты их векторов размерностей, кроме А’-х,
должны совпадать.
Результатом операции является массив, который по-
лучается путем конкатенации компонент LA с компонен-
тами RA по &-му измерению. Очевидно, что
£Д,[рр/?Д]/?Д = LA,RA. Число измерений R равняется
числу измерений LA или RA.
Если оба аргумента являются массивами и удовле-
творяют вышеуказанным требованиям, то R вычисляется
следующим образом.
Соответствующие компоненты векторов размерностей
R, LA и RA, кроме k-x, совпадают, k-я компонента век-
тора размерностей R равна сумме k-x компонент векто-
ров размерностей LA и RA. Результат композиции вы-
числяется так же, как и в случае смешанной функции
конкатенации. Например, если предположить, что LA и
RA являются трехмерными массивами и конкатенация
осуществляется по второму измерению, то R вычисляет-
ся по следующим правилам-
а) вычисляется вектор размерностей R выражением
(р£Д) [t£—1 ], ((рр£Д) [Л] + (р/?Д) [Л]Л+1(рр£Д)— k;
б) вычисляются компоненты R:
R[/,J,N]-*-LA если /^(р£Д) И,
иначе R [I;J;N]*-RA [I;J—(р£Д) [Л] ;Л/].
5* 6Т
Если один из аргументов является скаляром, а дру-
гой массивом, то при выполнении операции скаляр рас-
сматривается как фиктивный массив с тем же числом
измерений, что и другой аргумент. Компоненты вектора
размерностей этого фиктивного массива, кроме &-й, счи-
таются равными соответствующим компонентам вектора
размерностей другого аргумента, k-я компонента векто-
ра размерностей фиктивного массива считается рав-
ной 1. Компоненты фиктивного массива считаются рав-
ными значению скаляра. Дальнейшее вычисление R осу-
ществляется, как в предыдущем случае. Примеры:
Р, [ 1 ] Р или Р, Р Q. [П ( 3 4р. 12)
2 3 5 7 2 3 5 7 111 112 113 114
121 122 123 124
131 132 133 134
(0 Зр 2.5), [1| 0.5 211 212 213 214
0.5 0.5 0.5 221 222 223 224
231 232 233 234
1 2 3 4
5 6 7 8
9 10 11 12
Сжатие: U/\k\F — служит для построения нового
массива путем сжатия компонент RA по произвольному
&-му измерению; F представляет собой произвольный
массив с числом измерений не меньшим единицы, k—
порядковый номер измерения RA. Выполнение компози-
ции аналогично выполнению смешанной функции сжа-
тие (см. п. 3 7.2). В частности, £Д/[рр/?Д]/?Д = £Д//?Д.
Результат композиции вычисляется следующим об-
разом:
1. Если RA — пустой массив, то R-^RA.
2. Если RA — непустой массив и LA — логический
вектор, то необходимо, чтобы аргументы удовлетворяли
отношению (р£Д) = (р/?Д) [Л]. Результатом является
массив с тем же числом измерений, что и RA. Соответ-
ствующие компоненты векторов размерностей R и RA,
кроме k-x, совпадают, k-я компонента вектора размер-
ности R равняется значению выражения +/£Д. Очевид-
но, что если все компоненты £Д являются нулями, то
R — пустой массив. R получается из RA путем выбора
68
из последнего только тех компонент, &-е индексы кото-
рых указывают на компоненты LA, равные 1.
3. Если LA является логическим значением, то при
выполнении операции это значение рассматривается как
фиктивный вектор, длина которого равняется значению
выражения (р/?Д) [Л]. Компоненты этого вектора счи-
таются равными LA. Вычисление R осуществляется так
же, как и в предыдущем случае. Примеры:
1 О 1/[1|Х
ABCD
IJ KL
0/(2] Q
Расширение: U\ [&]F — служит для построения но-
вого массива путем вставления новых компонент в мас-
сив F, где F представляет собой произвольный массив
с числом измерений не меньше единицы; k — порядковый
номер измерения RA, U — логический вектор. Выполне-
ние композиции аналогично выполнению смешанной
функции расширение (см. п. 3.7.2), в частности
LA \ [рр/?Д]/?Д = £Д\/?Д.
Результатом композиции является массив с тем же
числом измерений и того же типа, что и RA. Соответст-
вующие компоненты векторов размерностей R и RA, кро-
ме k-x, равны; k-я компонента вектора размерностей R
вычисляется выражением (р£Д). Дополнительные ком-
поненты R равны нулю, если RA — числовое значение,
и равны символу <пробел>, если RA — символьное
значение; R вычисляется по следующим правилам:
1 Если RA — пустой массив, то композиция опреде-
лена только тогда, когда только k-я компонента вектора
размерностей RA равна нулю и LA состоит только из
нулей. В этом случае все компоненты R в зависимости
от типа RA, равны нулю или символу <пробел>
2. Если RA—непустой массив, то аргументы компо-
зиции должны удовлетворять отношению (+/£Д) =
= (р/?Д) {&]. В этом случае R строится из компонент RA
и, в зависимости от типа RA,— из нулей или пробелов.
Компоненты R вычисляются в лексикографическом по-
рядке изменения их индексов. Обозначим через £ зна-
чение k-ro индекса текущей компоненты R. Тогда зна-
чение компоненты R вычисляется по следующим пра-
вилам.
Если LA [£] равно 1, то из набора индексов компо-
ненты R формируется новый набор индексов, в котором
69
k-¥i индекс равен значению выражения -j-/LfLA,
а остальные индексы не меняются. Этот новый набор
индексов определяет компоненту RA, значение которой
присваивается соответствующей компоненте R. Если
LA [L] равно 0, то соответствующей компоненте R при-
сваивается 0 (или — символ <пробел>).
Например, если предположить, что RA является трех-
мерным числовым массивом и k равен 2, то результат
функции является трехмерным массивом, вектор размер-
ностей которого вычисляется выражением (р/?Д)(1(Л—1)],
(р£Д),(р/?Д) [Л]—k]. Компоненты 7? вычис-
ляются по следующему алгоритму.
R[r,J\N]^RA{r,+/J]LA-,N}, если L4[/]=l;
R -«-О, если LA [J] =0.
Примеры:
1 0 1\[1|Х 0 0 0\[1] (0 2р 1.5>
А В С D 0 0
1 II к 0 0
Е F G Н 0 0
I J К L
Вращение: Оф^]/7— является обобщением смешан-
ной бинарной функции вращения (см. п. 3.7.2); F пред-
ставляет собой произвольный массив с числом измере-
ний, не меньшим единицы, G — целое число, целочислен-
ный вектор или многомерный массив, k — порядковый
номер измерения RA. Результат композиции получают
вращая компоненты RA по &-му измерению аналогично
тому, как при выполнении смешанной функции враще-
ние. В частности, £Лф[рр/?Л]#Л =£Дф/?Д. Результат
является массивом с вектором размерностей, равным
вектору размерностей RA и вычисляется следующим
образом:
1. Если RA — пустой массив, то R-^RA.
2 Если RA — непустой массив, то LA должен быть
либо числом, либо массивом, который удовлетворяет
отношению
(pLA) = (k— 1)|р/?Д,
Различают два случая:
a) LA—число. В этом случае R получается враще-
нием компонент RA по &-му измерению на (tLA) пози-
70
дин так, как это описано в п. 3.7.2. Таким образом, если
предположить, что RA является трехмерным массивом
и k равно 2, то R вычисляется выражением
R^RA[\LA® t(pRA) И;];
б) LA — массив. В этом случае R получается враще-
нием компонент RA по £-му измерению для каждого
фиксированного набора индексов остальных измерений
на число позиций, указанное компонентой LA, которая
определяется этим фиксированным набором индексов.
Например, для случая, когда RA — трехмерный массив
н k равно 2, компоненты R вычисляются выражением
R[l\ ,N]*-RA[I,LA[I;N]Q)i(pRA) [ft];Л7].
Примеры:
2ф(1]Х
1JKL
ABCD
EFGH
-1 1 2 Зф(1]Е
31 22 33 14
11 32 13 24
21 12 23 34
3.9. Обращение к определяемой функции
3.9.1. Синтаксис
«фактический левый аргумеит>..= Спервичиое выражение>
Сфактический правый аргумеит> :=Свыраженне>
Собращенне к ннладнческой определяемой фуикции> =<имя
определяемой функции>
Собращенне к определяемой функции с аргументами>:: = Симя
определяемой функции > Спробел> Сфактический
правый аргумент> | Слевый фактический аргумеит>
Спробел><имя определяемой функции>Спробел>
Сфактический правый аргумент >
Совращение к определяемой фуикции>.:= собращенне
к ннладнческой определяемой функции>|
Собращенне к определяемой функции
с аргумеитамн>
3.9. Х Семантика
Обращение к определяемой функции служит для
обеспечения выполнения ее тела (см. п. 4.2.4). Оно так-
же имеет иифексную форму и состоит из имени опреде-
ляемой функции и соответствующего числа фактических
аргументов. Структура обращения к определяемой функ-
ции с явным результатом не отличается от структуры
обращения к определяемой функции без явного резуль-
тата.
71
Обращение с явным результатом определяет отдель-
ное значение, которое получается в результате выпол-
нения тела соответствующей определяемой функции. Это
значение может быть использовано непосредственно
в допустимых в языке выражениях. Обращение без
явного результата обеспечивает только выполнение тела
соответствующей определяемой функции. Оно не опре-
деляет значение, которое можно было бы использовать
непосредственно в допустимых в языке выражениях.
Результат выполнения обращения к определяемой,
функции независимо от ее вида эквивалентен результату
следующих действий в программе во время ее выпол-
нения-
1. Присваивание значений. Формальным аргументам
(если они есть) присваиваются значения соответствую-
щих фактических аргументов Эти присваивания следует
считать выполненными непосредственно перед входом
в тело определяемой функции.
2. Постановка и выполнение тела определяемой
функции После того, как формальным аргументам при-
своено значение, тело определяемой функции помещается
на место обращения к определяемой функции и выпол-
няется.
Определение области действия нелокальных имен
осуществляется во время выполнения обращения
к определяемой функции следующим образом:
если обращение к определяемой функции происходит
не из тела любой определяемой функции, то нелокали-
зованные, но используемые в теле функции имена рас-
сматриваются как имена определяемых функций пли как
имена глобальных переменных;
если обращение к определяемой функции произво-
дится изнутри тела, то противоречия, которые возникают
между идентификаторами локальных переменных, име-
ющих силу там, где расположено обращение к опреде-
ляемой функции, и идентификаторами, включенными при
подстановке тела функции и нелокализованнымн в ней,
разрешается в пользу локальных переменных.
Соответствие между фактическими и формальными
аргументами осуществляется по следующим правилам:
обращение к определяемой функции должно иметь
столько фактических аргументов, сколько формальных
аргументов содержится в заголовке соответствующей
определяемой функции, причем фактические аргументы
72
должны занимать те же позиции относительно имени
определяемой функции, что и соответствующие фор-
мальные аргументы;
фактические аргументы отделяются от имени опре-
деляемой функции хотя бы одним пробелом;
никакие ограничения на тип и структуру фактических
аргументов не накладываются. Контроль соответствия
типов и структур фактических аргументов формальным
аргументам должен осуществляться самой определяемой
функцией и, следовательно, за это несет ответственность
программист.
3. 9.3. Ограничения
Чтобы обращение к определяемой функции выполня-
лось, необходимо, чтобы эта функция была ранее опре-
делена (см. § 4.2). Необходимо также, чтобы действия
над формальными аргументами и телом определяемой
функции, рассмотренные выше, приводили бы к правиль-
ным операторам в языке АПЛ.
Поскольку обращение к определяемой функции без
явного результата не описывает отдельного значения, то
оно не может быть фактическим аргументом какого-ли-
бо обращения к функции с аргументами
3.10. Выполнение выражений
Согласно синтаксису, приведенному выше, выраже-
ния имеют одну из следующих структур LA\ mRA,
LAdRA, где LA представляет собой первичное выраже-
ние (скаляр, вектор, обобщенную переменную, индекси-
рование, выражение в круглых скобках, имя неладиче-
ской определяемой функции); т — символ унарной опе-
рации (символ унарной основной функции, имя унарной
определяемой функции); d — символ бинарной операции
(символ функции присваивания, символ бинарной основ-
ной функции, имя бинарной определяемой функции);
RA — любое выражение.
Рассмотрим порядок выполнения выражений, кото-
рые ие содержат круглых скобок
Если выражение имеет вид LA, то правила получения
его значения сравнительно просты и описываются
в § 2.8, 3.2, 3 3; если вид mRA или LAdRA, то, чтобы
получить его значение, необходимо сначала вычислить
соответственно значение RA или значения LA и RA.
73
Далее значение выражения получается с помощью пра-
вил, определяющих операции т или d, соответственно,
над значением RA или над значениями LA и RA. Левый
аргумент является первичным выражением и, следова-
тельно, его значение вычислимо. Если и RA — первичное
выражение, то и его значение вычислимо и, следователь-
но. можно получить значения рассматриваемых выраже-
ний. Если же RA является выражением вида mRA или
LAdRA, то для того, чтобы получить его значение, необ-
ходимо повторить заново описанный выше анализ для
выражений этого вида.
Очевидно, что процесс анализа RA будет продол-
жаться до тех пор, пока RA не окажется первичным
выражением. Тогда можно будет вычислить значение по-
следнего (справа) входящего в выражение обращения
к функции с аргументами. Его значение служит правым
аргументом предпоследнего входящего в выражение
обращения к функции с аргументами и так до тех пор,
пока не получится значение выражения. Таким образом,
выражения, не содержащие круглых скобок, вычисляют
выполнением справа налево входящих в него обращений
к функциям с аргументами.
На основании синтаксиса выражений и в соответст-
вии с установленным выше порядком вычисления бес-
скобочных выражений устанавливается следующий по-
рядок вычисления выражений:
1. Выражение выполняется путем последовательного
выполнения справа налево входящих в выражение обра-
щений к функциям с аргументами.
2. Значение выражения, содержащегося между пра-
вой круглой скобкой и соответствующей левой круглой
скобкой, вычисляется самостоятельно и используется
в дальнейших вычислениях Таким образом, желаемый
порядок выполнения обращений к функциям с аргумен-
тами в пределах одного выражения может быть достиг-
нут соответствующей расстановкой круглых скобок.
3. Прн вычислении выражений соблюдается единый
порядок старшинства для функции присваивания, ска-
лярных функций, смешанных функций, композиции и
определяемых функций с аргументами.
Рассмотрим несколько примеров, посредством кото-
рых поясняется порядок вычисления выражений, а также
иллюстрируются некоторые возможности АПЛ-выраже-
74
ний. Для этого предположим, что А, В, С, D и Е явля-
ются числовыми значениями.
1. Так как операции выполняются справа налево, то
выражение (А—В—С—D—Е) эквивалентно выражению
(А+С+Е)-(B+D).
2. Вычисление алгебраической дроби J
реализуется следующим АПЛ-выражением: 4-A-J-4-B+
+ 4-С+4-Е.
3. Пусть А—числовая матрица. Тогда выражение
I /I /А вычисляет максимальный элемент матрицы,
а выражение L/Г"/[1] А — минимальный из максималь-
ных элементов столбцов матрицы А.
4. Пусть V — символьный вектор, каждая компонен-
та которого является какой-либо цифрой. Тогда выраже-
ние (_l + ’0123456789’iVj+.Х ф -HpV вычисляет
целое десятичное число, которое внешне представляется
значением V, т. е., если, например, V-«-’1943’, то ре-
зультатом выражения является число 1943.
4.
Операторы
Единицы действия в языке называются операторами.
Они, вообще говоря, выполняются в той последователь-
ности, в которой вводятся с терминала. Операторы раз-
деляются на выполняемые и определяющие. Выполняе-
мый оператор — выражение, которое выполняется сразу
после его ввода с терминала. В языке имеется только
один определяющий оператор. Он обеспечивает возмож-
ность описания новой функции — определяемой. Опреде-
ляющий оператор имеет следующий общий вид-
V<:oпpeдeляeмaя функция >V. Он представляет собой
последовательность строк символов, первая из которых
начинается с символа V, а последняя заканчивается
символом V. Под определяемой функцией понимается ее
описание, которое состоит из заголовка и тела
Заголовок (первая строка определяющего оператора)
содержит характеристики определяемой функции; имя,
75
вид, формальные аргументы и локальные переменные.
Тело задает совокупность правил, описывающих
функцию, имя которой указано в заголовке. Оно строит-
ся из строк-операторов, каждый из которых является
оператором присваивания, оператором вывода, операто-
ром ветвления или комментарием.
Определяемая функция выполняется тогда, когда вы-
полняется соответствующее обращение к ней (см. § 3.9).
Ее текст сохраняется, и она может быть использована
неоднократно. Определяемые функции описываются
в § 4.2.
4.1. Выполняемые операторы
4.1.1. Синтаксис
Ссмешанный вывод>:: = <выраженне>;<выраженне>[
Ссмешанный вывод>,< выражение >
<оператор вывода>: =<первнчное выраженне> | <обращенне
к функции вывода> | <обращенне к основной
функции > | собращенне к определяемой функции>|
<смешанный вывод>
<оператор присваивания >: =<обращенне к функции
присваивания>
Свыполняемый оператор> =<оператор выводаХконец
строки> | <оператор присваивания > <конец
строки>
<конеи строки>. =<псевдоснмвол>
4.1.2. Семантика
Выполняемые операторы служат для определения
или изменения значений глобальных переменных, для
инициализации выполнения определяемых функций и
для организации вывода данных на терминал и/или на
печать. Их выполнение приводит к выполнению части
или всей программы и осуществляется сразу после вво-
да с терминала. После этого последовательности пред-
ставляющих их символов теряются, т. е. для повторного
выполнения их необходимо вводить заново. К выполняе-
мым операторам относятся оператор вывода и оператор
присваивания.
4.1.3. Оператор вывода
Служит для вывода значений некоторых выражений
на терминал, а также для загрузки определяемых функ-
ций. Выполнение оператора вывода осуществляется сле-
дующим образом:
76
1. Если оператор вывода является обращением
к функции вывод, результатом его выполнения является
результат обращения к функции вывод (см. п. 3.4.3).
2. Если оператор вывода является первичным выра-
жением или обращением к основной функции, его выпол-
нение соответственно аналогично выполнению одного из
следующих обращений к функции вывод-.
□-«-< первичное выражение> или
□-«-Совращение к основной функции>.
3. Если оператор вывода является обращением к оп-
ределяемой функции, то выделяются два случая:
а) соответствующая определяемая функция является
функцией с явным результатом. Тогда выполнение опера-
тора вывода аналогично следующему обращению к функ-
ции вывода:
□-«-Совращение к определяемой функции с явным
результатом>;
б) соответствующая определяемая функция является
функцией без явного результата. Тогда выполнение опе-
ратора вывода аналогично соответствующему обраще-
нию к определяемой функции.
4. Смешанный вывод обеспечивает возможность вы-
вода в одной строке терминала значений различного
типа. Он представляет собой последовательность выра-
жений, отделенных друг от друга точкой с запятой. Если
оператор вывода является смешанным выводом, он вы-
полняется в следующем порядке-
а) выражения, составляющие смешанный вывод, вы-
числяются справа налево. В результате их вычисления
формируется соответственно последовательность значе-
ний, вообще говоря, различного типа;
б) полученная на шаге а) последовательность значе-
ний выводится на терминал, начиная с ее конца. В стро-
ке терминала между значениями не оставляются ника-
кие пробелы. Если не вся последовательность значений
размещается в одной строке терминала, остаток перено-
сится в последующие строки.
Рассмотрим некоторые примеры использования опе-
ратора вывода.
)РР —4
125 0.00001 1 2 3 4 5
125 IE-5 1.234Е4
25;,1_)IS THE RESULT OF EXPRESION pt 25’
77
25 IS THE RESULT OF EXPRESION pt25
’A4-B=’; C’; i_jANDi_jA-B=’;64-G-(A^10) +
+ b«--3
A + B = 7 AND A — B = 13
Во втором и третьем примерах показано использова-
ние смешанного вывода.
4.1.4. Оператор присваивания
Служит для определения или изменения значений
переменных. Выполнение оператора присваивания ана-
логично выполнению обращения к функции присваива-
ния, за исключением того, что значение, производимое
функцией присваивания, в этом случае не используется.
Выражение, являющееся правым аргументом обра-
щения к функции присваивания, может содержать дру-
гие обращения к функции присваивания. Таким образом,
одним оператором присваивания можно определить или
изменить значения нескольких переменных. Пример:
В-«-(А [;2] -«-!) +рА-<-2 Зр 2-Н6
При выполнении этого оператора переменной А присваи-
вается числовая матрица из двух строк и трех столбцов.
Подвыражением А[;2]-<-1 изменяются компоненты вто-
рого столбца матрицы А
А В
3 15 3 4
•6 1 8
4.2. Определяемые функции
4.2.1. Синтаксис
<нмя определяемой функцнн> = <ндентнфнкатор>
<правый формальный аргумент> : = <ндентнфнкатор>
<левый формальный аргумент> : = <ндентнфнкатор>
<локальная переменная> = <ндентнфнкатор>
Сспнсок локальных переменных>. =<пусто> | <спнсок
локальных переменных>,<локальная переменная>
<заголовок>’=<нмя определяемой функцнн> | <нмя
определяемой функцнн> <пробел><правый
формальный аргумент > | <левый Формальный
78
аргумент;» Спробел>Снмя определяемой <рункцин>
Спробел> Справый формальный аргумент>
<заголовок определяемой функции без явного результата;»:: =
<заголовок><спнсок локальных переменных>
<заголовок определяемой функции с явным результатом > :=
Слокальная переменная >-«-<заголовокХспнсок
локальных переменных>
Сначало определяемой функции с явным результатом;».. =
\7<заголовок определяемой функции с явным
результатом X конец строки >
Сначало определяемой функции без явного результата >:: =
\7<заголовок определяемой функции без явного'
результатах конец строки >
Сномер строки;» =<цслое без знака;»
<метка>: =<ндептнфнкатор>
Споследовательность основных символов> =<основной
символ>|Споследовательность основных символов;»
< основной символ>
Сстрока основных символов > =<пусто> | споследовательность-
основных символов >
Скомментарнй> = Сстрока основных символов;»
Соператор ветвлсння> =-»Сметка> |-»-Свыраженне> |-»
Ссмешанный вывод;»
Снепомеченный оператор определяемой функции;» = Соператор
вывода;» | соператор присваивания;» | Соператор'
ветвления >
Соператор определяемой функцнн> = Снепомеченный оператор
определяемой функции> | Сметка>
Снепомеченный оператор определяемой функции>
Снеполная строка определяемой функции;» = Скомментарнй> |
Соператор определяемой функции>
Сполная строка определяемой функции;» = [сномер строки;»]
Спробел>Снеполная строка определяемой
функции;»Сконсц строки;»
Стело определяемой функцнн> = Спусто> | Стело определяемой
функции>Сполная строка определяемой функции;»
Сконец определяемой функции;» =Сномер строки>спробел>V
Скопец строки>
Сопределяемая функция с явным результатом;»- =Сначало
определяемой функции с явным результатом >
Стело определяемой функции> сконец определяемой
функции>
Сопределяемая функция без явного результата >.= Сначало
определяемой функции без явного результата >
Стело определяемой функцнн> Сконец определяемой
функции >
Сопределяемая функция;» = сопределяемая функция с явным
результатом > | сопределяемая функция без явного
результата >
4.2.2. Семвнтикв
Определяемая функция служит для задания совокуп-
ности правил обработки данных, связанной с именем
79-
этой функции. Можно описать ниладические (без аргу-
ментов), унарные или бинарные определяемые функции
с явным или без явного результата.
Определяемая функция с явным результатом соот-
ветствует понятию процедуры-функции, а определяемая
функция без явного результата — понятию общей про-
цедуры языка АЛГОЛ-60. Определяемая функция со-
стоит из двух основных составных частей: заголовка и
тела определяемой функции. В заголовке указывается
имя и вид определяемой функции, перечисляются ее
формальные аргументы и локальные переменные, ис-
пользуемые в теле определяемой функции.
Операторы в теле определяемой функции пронумеро-
ваны и могут быть помечены меткой. При выполнении
определяемой функции операторы-строки, составляющие
ее тело, выполняются, вообще говоря, в порядке возра-
стания их номеров Однако этот порядок может быть
нарушен оператором ветвления, который указывает но-
мер строки, с которой следует продолжить выполнение
тела определяемой функции Выполнение определяемой
функции заканчивается, когда возникает необходимость
выполнить строку, номер которой отсутствует среди но-
меров строк тела определяемой функции
4.2.3. Загоноаок онреденяемой функции
Вид определяемой функции определяется структурой
ее заголовка. Заголовок функции с явным результатом
начинается с идентификатора, за которым следует сим-
вол Структура остальной части заголовка определяе-
мой функции с явным результатом аналогична структуре
заголовка функции без явного результата. При состав-
лении заголовка необходимо учитывать следующее:
1. Идентификаторы, входящие в заголовок опреде-
ляемой функции, должны быть различными.
2. Идентификаторы, которые указаны в заголовке, за
исключением идентификатора, являющегося именем
определяемой функции, играют роль переменных. Эти
переменные локализованы в теле определяемой функ-
ции, т. е. они имеют силу только внутри функции. Это
означает, что вне определяемой функции вышеупомяну-
тые идентификаторы могут именовать любые другие ве-
личины (см. п. 4.2.6).
3. Идентификатор, являющийся именем определяе-
мой функции, рассматривается как глобальная величина.
80
4. Заголовок ниладической определяемой функции не
содержит формальных аргументов. Заголовок унарной
определяемой функции содержит один формальный ар-
гумент, который расположен справа от имени функции.
Заголовок бинарной определяемой функции содержит
два формальных аргумента, которые расположены спра-
ва и слева от имени функции.
5. Формальные аргументы (если они есть в заголов-
ке определяемой функции) отделяются от имени функ-
ции хотя бы одним пробелом
6. Формальным аргументам присваиваются значения
во время выполнения обращения к определяемой функ-
ции (см. п. 3 9 2) При выполнении тела функции значе-
ния формальных аргументов могут быть изменены.
7. Формальные аргументы не накладывают никаких
ограничений на тип и структуру соответствующих фак-
тических аргументов Это должно быть учтено при опи-
сании тела определяемой функции. В теле функции
должны анализироваться тип и структура аргументов и,
в соответствии с возможными результатами анализа,
должны быть предусмотрены описания действий, кото-
рые следует выполнить.
8 Локальным переменным, перечисленным в заго-
ловке определяемой функции, присваиваются значения
во время выполнения тела функции
9. Локальная переменная, которая в заголовке опре-
деляемой функции с явным результатом занимает место
перед символом играет особую роль Она представ-
ляет результат этой функции. Это означает, что в тело
соответствующей функции должны входить одно или не-
сколько обращений к функции присваивания, у которых
левым аргументом является вышеупомянутая локальная
переменная. При выполнении тела определяемой функ-
ции хотя бы одно из этих обращений к функции при-
сваивания должно выполняться. Значение, которое по-
лучает эта локальная переменная в результате выпол-
нения тела определяемой функции, и является значением
обращения к этой функции с явным результатом
4.2.4. Тело определяемой функции
Согласно синтаксису тело определяемой функции
может быть пустым или последовательностью строк опе-
раторов. При его составлении необходимо учитывать
следующее:
6—265 81
1. Определяемая функция с пустым телом определяет
пустое действие.
2. Строки определяемой функции нумеруются. Стро-
ке, следующей за заголовком этой функции, дается но-
мер 1, следующей строке — 2 и т. д. Номера строк ис-
пользуются явным образом в операторе ветвления.
3. Метки рассматриваются как локальные констан-
ты, равные номерам строк, в которых содержатся эти
метки. Они могут быть составными частями выражений,
входящих в тело определяемой функции, за исключением
левых аргументов обращений к функции присваивания,
т. е. изменять значения меток запрещается. Оператор
тела определяемой функции может быть помечен не бо-
лее чем одной меткой. Нельзя использовать одни и те
же идентификаторы для обозначения меток и локальных
переменных.
4. Строка-комментарий содержит любую последова-
тельность основных символов. В частности, она исполь-
зуется для помещения в тело определяемой функции
краткого словесного ее описания. При выполнении опре-
деляемой функции строки-комментарии пропускаются.
5. Оператор вывода описан в п. 4.1.3.
6. Оператор присваивания описан в п. 4.1.4.
4.2.S. Оператор ветвления
Посредством оператора ветвления организуются без-
условные и условные переходы к строкам-операторам
определяемой функции. Рассмотрим выполнение различ-
ных форм операторов ветвления.
1. Если оператор ветвления имеет вид. -»-<метка>,
он определяет в качестве своего преемника оператор
определяемой функции, содержащийся в строке, номер
которой равен значению метки.
2. Если оператор ветвления имеет вид:
-»-<выражение>, то он имеет смысл только тогда, ког-
да значение выражения является пустым вектором, це-
лым положительным числом, нулем или целочисленным
вектором, первая компонента которого является нулем
или положительным числом. Рассмотрим эти случаи.
а) значение выражения — пустой вектор. В этом слу-
чае оператор ветвления не прерывает естественного по-
рядка выполнения операторов определяемой функции,
т. е. управление передается следующему за оператором
ветвления оператору;
82
б) значение выражения — нуль. В этом случае опе-
ратор ветвления осуществляет выход из определяемой
функции, т. е. функция завершает свою работу;
в) значение выражения — целое положительное чис-
ло. В этом случае преемником оператора ветвления яв-
ляется оператор, содержащийся в строке, номер которой
равен этому числу. Если в теле определяемой функции
нет строки с таким номером, то осуществляется выход
из определяемой функции;
г) значение выражения — числовой вектор Преем-
ник оператора ветвления определяется в зависимости от
первой компоненты этого вектора аналогично тому, как
описано в случаях б) и в).
3. Оператор ветвления, имеющий вид >< с мешанный
вывод>, выполняется следующим образом:
а) выполняется смешанный вывод, как описано
в п. 4.1 3;
б) преемник оператора ветвления определяется по
значению первого выражения, входящего в смешанный
вывод, согласно правилам, описанным в п. 2 данного
раздела
Рассмотрим несколько примеров использования опе-
ратора ветвления. Для этого введем некоторые обозна-
чения. Пусть X н Y представляют собой первичные вы-
ражения, а г — один из следующих символов основных
функций: < ^ = #=:>> V AVA
1. Ветвление к метке М или выполнение следующего
оператора
-*(XrY)/M.
—*(XrY)pM.
— MXtA'rV.
2. Ветвление к метке Ml или к метке М2
—»(М2, М1)[14-ХгИ
-*((XrY), ^(XrY))/Ml, М2.
3. Ветвление к одному из нескольких операторов
-*((X>Y), (X = Y), X<Y)/M1, М2, М3
->I(DV,
где V-<-Ml, М2, ... MN, т. e. V является вектором из
номеров строк, а I — некоторым счетчиком.
6* 83
4.2.6. Локальные и глобальные переменные
Локальные переменные — это такие переменные, вре-
мя существования которых равно времени выполнения
определяемой функции, в заголовке которой они пере-
числены (см. п. 4.2.3). Все остальные переменные счи-
таются глобальными (см. п. 2.7).
Если имеются две переменные с одинаковым именем
и одна из них глобальная, а другая локальная, то при
выполнении соответствующей определяемой функции до-
минирует локальная переменная. Таким образом, если
нежелательно изменение значения глобальной перемен-
ной внутри функции, то переменную можно локализо-
вать, перечислив ее в заголовке соответствующей опре-
деляемой функции.
Кроме локальных переменных, в теле определяемой
функции могут использоваться и другие переменные
(вообще говоря — другие имена). Онн рассматриваются
как иелокализованные в данной определяемой функции
переменные (имена). Область действия нелокализован-
ных величин определяется во время выполнения про-
граммы по правилам, описанным в п. 3.9.2.
4.2.7. Рекурсивные определяемые функции
Согласно синтаксису в теле определяемой функции
могут встречаться обращения к другим определяемым
функциям н не исключается возможность обращения
к самой себе непосредственно или через другие функции.
Повторное обращение к определяемой функции, ко-
торое происходит раньше, чем закончилось выполнение
этой определяемой функции, называется рекурсивным
обращением к ней, а соответствующая определяемая
функция — рекурсивной
Выполнение рекурсивных обращений к определяемым
функциям осуществляется так же, как и выполнение не-
рекурсивных обращений (см. § 3 9). При этом соблю-
даются правила, устанавливающие область определения
идентификаторов, описанные в п. 4 2.6 и 3 9.2.
4.2.8. Примеры определяемых функций и их использование
Для иллюстрации видов определяемых функций ис-
пользуется алгоритм вычисления среднего арифметиче-
ского положительных компонент числового массива:
84
VSUM V; SP
jl] VSP —(0<, V)/. V
}2] SP«—HZV5P
J3] R — SP-r-4-/0< V
Hl V
W—SUMI V; SP; U
PJ VSP*— (U*-0< V)/, V
12] SP— +/VSP
13] R —SP-h+/U
Hl V
В первом примере приведена определяемая функция
с именем SUM, без явного результата, с одним формаль-
ным аргументом Уис одной локальной переменной SP.
В теле функции используются нелокальные переменные
VSP и R. Предполагается, что V может быть любым
числовым, непустым значением
Первый оператор функции вычисляет вектор VSP,
который составляется из положительных компонент мас-
сива V, второй—сумму компонент вектора VSP, тре-
тий— среднее арифметическое компонент вектора VSP
и присваивает его переменной R
Предположим, что до обращения к определяемой
функции переменным R и VSP присваиваются некото-
рые значения, а именно:
R—I0
VSP—15
Обратимся к функции SUM для вычисления среднего
арифметического положительных компонент вектора
2-1-1310.
SUM 2-1-1310
Так как функция без явного результата и, кроме того,
не содержит операторов вывода, то на терминал ничего
не выводится. Рассмотрим значения переменных VSP
и R:
VSP I R
2 3 1 | 2
Таким образом, в результате выполнения определяе-
мой функции SUM были изменены значения глобальных
переменных VSP и R.
Во втором примере приведена определяемая функ-
ция с явным результатом SUM1. Она содержит локаль-
ные переменные R, V, SP и U. В теле функции исполь-
зуется нелокалнзованная переменная VSP. Локальная
85
переменная R служит для обозначения результата функ-
ции. Локальная переменная U служит для хранения
промежуточного результата вычислений. Ее использова-
ние сокращает время выполнения функции.
Определяемая функция SUM1 выполняет те же дей-
ствия, что н функция SUM. При ее выполнении глобаль-
ная переменная R остается без изменения, а глобальная
переменная VSP меняет свое значение. Пример:
R—10
VSP*— 15
SUM1 2-1-1310
2
Так как SUM1—определяемая функция с явным ре-
зультатом, то на терминал выводится ее значение.
VSP I R
231 I 10
Вышеупомянутый алгоритм может быть описан в более
компактном виде.
VR*~SUM2 \; U
(II R_(+/U/,V)-b+/U-0<,V
121 V
SUM2 — определяемая функция с явным результатом.
В ней используются только локализованные переменные.
Предположим, что значением переменной А является
матрица 2 Зр4—16. Тогда
SUM2 A 4-J-SUM2 А
2 6
Рассмотрим определяемую функцию, которая сорти-
рует элементы любого числового массива в неубываю-
щем порядке.
VSORT F
[1J—*(0 = ppF)/4
[2]^(0=4X/pF)/BEGIN
[3j —~ O = pZ>- ’ARGUMENT ERROR’
(4J BEGIN: S —(pF)p(.F) tf.Fl
Pl V
86
Это определяемая функция без явного результата с од-
ним формальным аргументом F Ее имя — SORT. В ней
используется нелокальная переменная S и метка BEGIN
Первый оператор функции анализирует, является ли
аргумент числовым скаляром. Если да, то управление
передается оператору из 4-й строки, если нет, выполня-
ется следующий оператор. Второй оператор анализирует
и исключает случай, когда аргумент является пустым
массивом. Если массив F — непустой, то в результате
выполнения оператора ветвления управление передается
оператору с меткой BEGIN, т е. четвертому оператору.
Если массив пустой, то выполняется следующий опе-
ратор, третий, который выдает сообщение об ошибочном
аргументе и-завершает выполнение функции. Четвертый
оператор упорядочивает в неубывающем порядке любой
непустой числовой массив. Упорядоченный массив при-
сваивается нелокальной переменной S.
5.
Организация программ
Благодаря тому, что язык обладает достаточно лако-
ничными выразительными средствами и широким набо-
ром операций над массивами, использование которых
очень часто освобождает от необходимости организации
циклов, небольшие, но сложные программы могут быть
изображены с помощью одного или нескольких выпол-
няемых операторов без использования определяемых
функций. Примерами таких программ могут служить
выражения, приведенные в § 3 10.
Однако программы, описанные посредством выпол-
няемых операторов, являются программами одноразово-
го пользования. Примерами программы, которые могут
быть использованы неограниченное число раз, являются
определяемые функции. В языке отсутствует понятие
главной программы. Пользователь с помощью выполняе-
мых операторов управляет порядком вычисления опре-
деляемых функций.
Задача может быть разбита на части и для каждой
из частей может быть составлена соответствующая опре-
деляемая функция. Пользователь по желанию может
выполнить каждую из них отдельно или может составить
некоторую (главную) определяемую функцию, которая
описывает порядок выполнения ранее составленных
функций и выполнение которой решает данную задачу.
На языке АПЛ очень легко и удобно создавать на-
боры определяемых функций для решения какого-нибудь
конкретного класса задач. Например, в работе [21]
предлагается набор определяемых функций, реализую-
щих операции над массивами комплексных чисел, а в ра-
боте [2] набор определяемых функций для решения за-
дач вычислительной вероятности и статистики. Решение
конкретной задачи из данного класса сводится либо
к написанию выполняемого оператора, в который вхо-
дят обращения к ранее составленным функциям, либо
к составлению и выполнению новой определяемой функ-
ции, в которой используются ранее составленные
функции
При программировании на АПЛ необходимо обратить
внимание на некоторые его особенности:
1. Выполнение выражений осуществляется справа
налево. Но этот порядок выполнения выражений может
быть изменен пользователем с помощью круглых ско-
бок В этих случаях необходимо иметь в виду те изме-
нения переменных, которые осуществляются при выпол-
нении входящих в выражения функций присваивания.
Это особенно важно в тех случаях, когда изменение пе-
ременной выполняется позже ее первого использования.
Примеры-
А*—21 В*—21
□ *—(А 2)-|-А Г] МВ - 2) +1 В
23
В первом примере выполнение выражения в круглых
скобках приводит к присваиванию нового значения пе-
ременной А и это новое значение используется в качест-
ве правого аргумента функции сложения. Во втором
примере выполнение выражения в круглых скобках при-
водит к изменению переменной В, ио оно вычисляется
позже, чем функция абсолютное значение величины, ре-
зультат которой является правым аргументом функции
сложения.
2 Как было отмечено в § 3.9, обращение к опреде-
ляемой функции осуществляется по значению. Однако
посредством функции выполнить можно моделировать
обращение к определяемой функции по наименованию.
88
Например, рассмотрим определяемую функцию CONK.
VA CONK В
[1] ов.’ч—’,В,’,А’
PI V
Если теперь предположить, что значение В равно
’X’, то при выполнении функции CONK первая строка
преобразуется к виду О’Х-<-Х ,А. А если значение В рав-
но ’У’, то к видуО’У-«-У,А.
3. При составлении программ необходимо учитывать
динамическую вложенность обращений к определяемым
функциям. В зависимости от места обращения, нелока-
лизованные идентификаторы, используемые в теле функ-
ции, могут именовать различные величины. Примеры
\7R-FN VR—TESTI Y \7R-<—TEST2
pl R-XY P1R—FN-Y Y;FN
12] V 12] V |1] FN — (RY)-s-2 [2] R —TESTI FN
[3] V
Выше приведены три определяемые функции с явным
результатом: FN, TEST1 и TEST2 Рассмотрим их вы-
полнение.
У—-15 TEST1 -15 TEST2 '15
FN 14 О
-1
Идентификатор FN используется во всех трех опреде-
ляемых функциях. При выполнении оператора TEST1
_15 в теле функции TEST1 идентификатор FN рассмат-
ривается как имя определяемой функции FN Определяе-
мая функция TEST2 содержит локальную переменную
FN. В ее теле содержится обращение к функции TEST1
с фактическим аргументом FN. В этом случае при вы-
полнении функции TEST1 имя FN рассматривается как
имя локальной переменной, значение которой вычисля-
ется оператором [1] функции TEST2.
4 Символика, используемая для обозначения основ-
ных функций, выбрана в основном с целью достижения
компактности выражений, что привело в некоторых слу-
чаях к отказу от привычных обозначений. Например,
89
нельзя считать достаточно удобными обозначения триго-
нометрических функций Неудобства такого рода могут
быть легко устранены написанием определяемых функ-
ций, которые выполняют те же действия, что и соответ-
ствующие основные функции, но наименования которых
являются более привычными Например,
VR*—SIN X
[1J R — 1оХ
[2] V
V7R — COS X
[1] R —2ОХ
12J V
Очевидно, что Io Y^SIN Y и 2о Y = COS Y.
Необходимо отметить, что диалоговые системы, по-
строенные на основе языка АПЛ, обладают очень раз-
витым аппаратом редактирования и контроля за выпол-
нением определяемых функций. Кроме этого, они имеют
мощные и гибкие архивные системы, позволяющие по-
ставить на временное или долгосрочное хранение от-
дельные переменные, отдельные определяемые функции,
группы переменных, группы определяемых функций,
группы переменных и определяемых функций, а также
все программные объекты активной интерактивной сре-
ды. Эти архивные системы могут быть рассмотрены как
некоторые банки данных, ориентированные на обработ-
ку информации на языке АПЛ. В последнее время АПЛ
был расширен введением более сильного обобщения его
некоторых основных функций (например, конкатенация,
кодирование, декодирование и др ) и включением в него
новых функций (например, функций, реализующих
ввод — вывод данных по формату и др. [6]).
Рассмотрим примеры описания программ в виде оп-
ределяемых функций
VPP;T
[1| Р—1-|-Т — 1
[2] PT:—i(END<pP)/PTl
ADD: — (v/0 = P(T — T-(-2)/ADD
|4] P —P.T
[5]—P,T
(6] PT1:P
FI V
90
Ниладическая определяемая функция без явного резуль-
тата РР вычисляет и печатает последовательность про-
стых чисел. Длина последовательности определяется
значением нелокальной переменной END.
V DELETE NM; J
PJ J«-0
|21-^6Х<(рЛ) flj < J
[3|-*2X‘A/A P-J+l;| = (ltpA)fNM
[4] A —(((J— l)pl),O,((pA)|l]-J)pl)/|l]A
[5J-0
|6] ’NAME: i—J’, NM’. l_jNOT FOUND’
|7J V
Унарная определяемая функция без явного результа-
та DELETE осуществляет удаление имени, указанного
формальным аргументом NM, из матрицы имен А.
В матрице А каждое имя занимает одну строку. Поиск
имени осуществляется последовательным просмотром
строк матрицы. Если имя найдено, то из матрицы А уда-
ляется содержащая его строка; иначе печатается соот-
ветствующее сообщение:
VR*-LA COMPR1 RA; I
{1| - ((р LA) = р RA) А (1 = РР LA))/OK
|2] — ОХРП*-’ARGUMENT ERROR’
[3| OK-.I —J — 0
14] R-(+/LA)pRA{I]
|5] BEG: —*((pLA)< !•<—I-|-1)/0
[6] — ((LA|I]=1), LA [I] = 0)/DA, BEG
17) DA:RfJ«—J-|-1]«—RA]I]
J8] —>BEG
Бинарная определяемая функция с явным результа-
том COMPR1 реализует основную функцию сжатие для
случая, когда оба ее аргумента являются векторами.
VS—LA COMPR2 RA;RVEC;LAR
fl] —>(1 <ppRA)/OK
91
I2J — О, ?□—’ARGUMENT ERROR: (РР RA) < 1’
|3] OK:LAR-«-(X/P RA) P LA
J4J RVEC<—("1 | prA) + /LA
|5J S RVEC p LAR COMPR1, RA
[6J V
Бинарная определяемая функция COMPR2 реализует
основную функцию сжатие в случаях, когда правый ар-
гумент является массивом с числом измерений боль-
шим 1, а левый — вектором. Алгоритм ее выполнения
состоит в преобразовании правого аргумента в вектор
и построении соответствующего левого аргумента для
того, чтобы использовать определяемую функцию
COMPR1, описанную в предыдущем примере Результат
функции COMPR1 переструктурируется в соответствии
с результатом функции сжатие для рассматриваемой
структуры правого аргумента.
ПРИЛОЖЕНИЕ
Схематиче- ское нзобра жен не Наименование ф\ HKHIHI Стра ннца Схематиче- ское изобра- жение Наименование ф.нкции Стра- ница
+ F Идентичность 39 G#F He равно 40
G + F Сложение 39 G^F Больше
— F Изменение 39 или равно 40
знака G> F Больше 40
G — F Вычитание 39 Структура 18
XF Знак числа 39 VfF Перестройка 19
G^F Умножение 39 ,F Разверт ка 20
+ F Обратное 39 G.F Конкатенация 20
значение числа G,[fe|F Конкатенация 67
G + F Деление 39 tS Г енера гор
4г F Экспонента 39 индексов 21
G*F Возведение ViF Индекс 49
в степень 39 вхождения
VF Крыша 39 Индексация по возрастанию 46
G|" F Максимум 39 • F Индексация
LF Пол 39 по убыванию 46
G\_F Минимум 39 Инверсия 46
IF Абсолютная 39 41 Инверсия 64
G\F величина Вы'-ет G®F' G ф H F <S> F Вращение Вращение 57 70
! F G lF Факториал Сочетание 42 42 Унарная ।ранспозиция 47
®F Натуральный 39 V О F Бинарная
логарифм 1 ране позиция 58
G®F Логарифм 39 VfF Выборка 50
> F Случайное V[F Вычеркивание 52
S?S1 число 40 U/F Сжат ие 54
Вектор случайных чнсет 60 U/\k\F Сжатие 68
OF Умножение на к 40 U \F Расширение 55
SQF Тригонометри- t'xlfel F Расширение 69
ческне функции 40 U £= F Прина длежност ь 50
•%. F НЕ 40 v ts Кодирование 60
G/\F И 40 V J_ VI Декодирование 61
G\/ F ИЛИ 40 H Л1 Обращение
GAF НЕ —И 40 маг| пч ное 47
G»F НЕ - ИЛИ 40 Al |—| M1 Деление матриц 62
G<F Меньше 40 Qv Выполнить 48
G<F Меньше нли ра вно Равно 40 cliF Редукция 63
G = F 40 d/'\k} F Редукция 63
93
17 Sandra Pakin. APL/360 Reference manual —Chicago Science Re-
search Associates, 1970 — 160 p
18 Katzan Harry. APL programming and computer tecniques —New
York, 1970 — 329 p
19 Mock T. J, Vasarhely M. A. APL for management —New York:
J Wiley and Sons, 1972 — 255 p
20 . Falkoff A .D., Iverson К- E. The design of APL — IBM J Res
and Dev, 1973, v 17, № 3, p 324—334
21 Falkoff A. D., Iverson К- E. The APL/360 terminal system —IBM
J Res and Rev, 1973, v. 17, № 3, p 22—37
22 A system of APL functions to study computer networks — AF1PS
conference processing, 1973, v 42, June
23 . Brown J. A. A generalization of APL —Springfild, 1973
24 Chandour Z., Merel J. General arrays, operators and functions —
IBM J Res and Dev, 1973, v. 17, № 4, p 335—352
25 Eimutis E. C. APL/370 a useful simulation tool —Simulation,
1973, v 2, p 67—78
26 APL congress 73 —Amsterdam — London, 1973 — 506 p
27 . Wiedemann C. Handbook of APL programming — New York:
Petrocelli Books, 1974 — 213 p
28 Proceedings of the sixth international APL user’s conference —
Anheim, May 14—17, 1974 —596 p
29 Proceeding congress APL 75, 11 —13 June 1975 —N Y, 1975
30 Hagman W. D., Linden D. J., Mai K- F., Newell S. M., We-
ber J. C. A progiam generator — IBM Syst J, 1975, № 2
31 . Crossley D. Not just a programming language—Data Proces
1975, v 17, № 12, p 88, 90, 92—95
32 Smillie K. W. Mathematical notation, APL and programming lan-
guages — APL Quote Quad, 1975, v 6, № 3, p 11—16
33 Evans D. J. Large scale scientific problem formulation using
APL — SIGPLAN Notices, 1975, v 10, № 3, p 153—163
34 Hoegl H. R. The extension of APL to treelike data stiuctures —
APL Quote Quad, 1976, v 7, № 2, p 8—18
35 Hand В. M., Ranlet К. B. Computer simulation in introductory
geology —Coinput Geoscience, 1976, v 2, № 1, p 9—21
36 APL-76. Ottava 22—24 Sept 1976/ Ed H G Trumen —New
York, Assoc Comp Meeh, 1976, VIII —459 p.
37 . Hassit A, Lyon L. E. An APL emulator on system/370 —IBM
Syst J, 1976, v 15, № 4, p 358—378
38 Joworsky A. Un system d’aide a la programation de aniero mic-
roproceceur — Rev Techn , 1976, v 8, № 2, p 255—282
39 Dunworth, Hellestrand G. P. The use of APL in digital systems
courses at the university of New South walles — IEEE Trans,
1977, v E-20, К» 1, p 45—51
40 . Cohen J. APL |X| un multiposte APL —Minis and Macros, 1977,
№ 59, p 9—10
41 Henry-Labordere A. Realisation d’une micio-machine APL —
P—1—Informatique, 1978, № 94, p 39—42
42 . Backus J. Can programming be liberated from the von Nemann
style? A functional stvle and its algebra of programs. — Com of
ACM, 1978, v 21, № 8
43 Poso L. G APL makes splash in small computers — Electronics,
1978, v 51, p 68—69
44 Holmes W. H. Is APL a programming language? — Computer J,
1978, v 21, № 2, p 128—131
95
17 Sandra Pakin. APL/360 Reference manual —Chicago Science Re-
search Associates, 1970 — 160 p
18 Katzan Harry. APL programming and computer tecniques —New
York, 1970 — 329 p
19 Mock T. J, Vasarhely M. A. APL for management —New York:
J Wiley and Sons, 1972 — 255 p
20 . Falkoff A .D., Iverson К- E. The design of APL — IBM J Res
and Dev, 1973, v 17, № 3, p 324—334
21 Falkoff A. D., Iverson К- E. The APL/360 terminal system —IBM
J Res and Rev, 1973, v. 17, № 3, p 22—37
22 A system of APL functions to study computer networks — AF1PS
conference processing, 1973, v 42, June
23 . Brown J. A. A generalization of APL —Springfild, 1973
24 Chandour Z., Merel J. General arrays, operators and functions —
IBM J Res and Dev, 1973, v. 17, № 4, p 335—352
25 Eimutis E. C. APL/370 a useful simulation tool —Simulation,
1973, v 2, p 67—78
26 APL congress 73 —Amsterdam — London, 1973 — 506 p
27 . Wiedemann C. Handbook of APL programming — New York:
Petrocelli Books, 1974 — 213 p
28 Proceedings of the sixth international APL user’s conference —
Anheim, May 14—17, 1974 —596 p
29 Proceeding congress APL 75, 11 —13 June 1975 —N Y, 1975
30 Hagman W. D., Linden D. J., Mai K- F., Newell S. M., We-
ber J. C. A progiam generator — IBM Syst J, 1975, № 2
31 . Crossley D. Not just a programming language—Data Proces
1975, v 17, № 12, p 88, 90, 92—95
32 Smillie K. W. Mathematical notation, APL and programming lan-
guages — APL Quote Quad, 1975, v 6, № 3, p 11—16
33 Evans D. J. Large scale scientific problem formulation using
APL — SIGPLAN Notices, 1975, v 10, № 3, p 153—163
34 Hoegl H. R. The extension of APL to treelike data stiuctures —
APL Quote Quad, 1976, v 7, № 2, p 8—18
35 Hand В. M., Ranlet К. B. Computer simulation in introductory
geology —Coinput Geoscience, 1976, v 2, № 1, p 9—21
36 APL-76. Ottava 22—24 Sept 1976/ Ed H G Trumen —New
York, Assoc Comp Meeh, 1976, VIII —459 p.
37 . Hassit A, Lyon L. E. An APL emulator on system/370 —IBM
Syst J, 1976, v 15, № 4, p 358—378
38 Joworsky A. Un system d’aide a la programation de aniero mic-
roproceceur — Rev Techn , 1976, v 8, № 2, p 255—282
39 Dunworth, Hellestrand G. P. The use of APL in digital systems
courses at the university of New South walles — IEEE Trans,
1977, v E-20, К» 1, p 45—51
40 . Cohen J. APL |X| un multiposte APL —Minis and Macros, 1977,
№ 59, p 9—10
41 Henry-Labordere A. Realisation d’une micio-machine APL —
P—1—Informatique, 1978, № 94, p 39—42
42 . Backus J. Can programming be liberated from the von Nemann
style? A functional stvle and its algebra of programs. — Com of
ACM, 1978, v 21, № 8
43 Poso L. G APL makes splash in small computers — Electronics,
1978, v 51, p 68—69
44 Holmes W. H. Is APL a programming language? — Computer J,
1978, v 21, № 2, p 128—131
95
Оглавление
Предисловие.............................................. 3
Введение . . 3
1. Структура языка....................................... 3
2. Основные символы, идентификаторы, числа, векторы
основные понятия ................................ Ю
2 1 Буквы . . *0
22 Цифры .... . ... .10
2 3 Ограничители .... . ... 10
2 4 Идентификаторы . . ... II
2 5 Числа . .... . ..11
2 6 Векторы . . . .... 12
2 7 Величины и их области действия.......................13
2 8 Значение и типы ... .... 13
3. Выражения . ..................................16
3 1 Обозначения и некоторые базовые операции . . 17
3 2 Переменные .... 23
3 3 Первичные выражения .... 29
3 4 Обращение к функции присваивания ... . . 32
3 5 Обращение к основным функциям . . 36
3 6 Скалярные функции ... .38
3 7 Смешанные функции....................................45
3 8. Композиции . . 63
3 9 Обращение к определяемой функции.....................71
3 10 Выполнение выражений .... .... 73
4 . Операторы . .... ...............75
4 1 Выполняемые операторы . . 76
4 2 Определяемые функции .... 78
5 . Организация программ............................ . 37
Приложение................ .... ... 93
Список литературы........................................94