Text
                    Н. А. МАГАРИУ
ЯЗЫК ПРОГРАММИРОВАНИЯ

Н. А. МАГАРИУ ЯЗЫК ПРОГРАММИРОВАНИЯ АПЛ Е МОСКВА «РАДИО И СВЯЗЬ» 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