Синтаксис и символы APL

Набор правил, определяющих правильно структурированные программы

Язык программирования APL отличается тем, что он символьный , а не лексический : его примитивы обозначаются символами , а не словами. Эти символы изначально были придуманы как математическая нотация для описания алгоритмов. [1] Программисты APL часто назначают неформальные имена при обсуждении функций и операторов (например, «product» для ×/), но основные функции и операторы, предоставляемые языком, обозначаются нетекстовыми символами.

Монадические и диадические функции

Большинство символов обозначают функции или операторы . Монадическая функция принимает в качестве аргумента результат вычисления всего, что находится справа от нее. (Модерируется обычным образом с помощью скобок.) Двойная функция имеет еще один аргумент, первый элемент данных слева. Многие символы обозначают как монадические, так и диадические функции, интерпретируемые в соответствии с использованием. Например, ⌊3.2 дает 3, наибольшее целое число, не превышающее аргумент, а 3⌊2 дает 2, меньший из двух аргументов.

Функции и операторы

APL использует термин оператор в смысле Хевисайда как модератор функции, в отличие от использования того же термина некоторыми другими языками программирования как чего-то, что работает с данными, ссылка. реляционный оператор и операторы вообще . Другие языки программирования также иногда используют этот термин взаимозаменяемо с функцией , однако оба термина используются в APL более точно. [2] [3] [4] [5] [6] Ранние определения символов APL были очень конкретны в отношении того, как символы были классифицированы. [7] Например, оператор reduce обозначается прямой косой чертой и уменьшает массив вдоль одной оси, вставляя свой операнд функции . Пример reduce :

 ×/2 3 424
<< Эквивалентные результаты в APL >>
<< Оператор Reduce / используется слева
 2×3×424

В приведенном выше случае оператор reduce или slash смягчает функцию умножения . Выражение ×/2 3 4 вычисляется как скалярный (только 1 элемент) результат путем сокращения массива путем умножения. Приведенный выше случай упрощен, представьте себе умножение (сложение, вычитание или деление) большего количества чисел, чем просто несколько. (Из вектора ×/ возвращает произведение всех его элементов.)


 1 0 1\45 6745 0 67
<< Противоположные результаты в APL >>
<< Развернуть диадическую функцию \ используется слева
Повторить диадическую функцию / используется справа >>
 1 0 1/45 0 6745 67

Приведенные выше примеры диадических функций [примеры слева и справа] (использующие один и тот же символ / , пример справа) демонстрируют, как логические значения (0 и 1) могут использоваться в качестве левых аргументов для функций \ expand и / replicate для получения совершенно противоположных результатов. С левой стороны 2-элементный вектор {45 67} расширяется , где встречаются логические 0, чтобы получить 3-элементный вектор {45 0 67} — обратите внимание, как APL вставил 0 в вектор. С другой стороны, полная противоположность происходит с правой стороны — где 3-элементный вектор становится просто 2-элементным; логические 0 удаляют элементы с помощью диадической функции / slash . Символы APL также работают со списками (векторами) элементов, используя типы данных, отличные от просто числовых, например, 2-элементный вектор символьных строк {"Apples" "Oranges"} можно заменить числовым вектором {45 67} выше.

Правила синтаксиса

В APL иерархия приоритетов для функций или операторов строго позиционная: выражения вычисляются справа налево. APL не следует обычному приоритету операторов других языков программирования; например, ×не связывает свои операнды более «тесно», чем +. Вместо приоритета операторов APL определяет понятие области действия .

Область действия функции определяет ее аргументы . Функции имеют длинную правую область действия : то есть они принимают в качестве правых аргументов все, что находится справа. Двоичная функция имеет короткую левую область действия : она принимает в качестве левых аргументов первый фрагмент данных слева. Например, (самый левый столбец ниже — это фактический программный код из сеанса пользователя APL , с отступом = фактический пользовательский ввод , без отступа = результат, возвращаемый интерпретатором APL ):


Оператор может иметь функциональные или данные операнды и вычислять диадическую или монадическую функцию. Операторы имеют длинную левую область видимости. Оператор принимает в качестве своего левого операнда самую длинную функцию слева от себя. Например:

Левый операнд для оператора over-each¨ — это функция index ⍳ . Производная функция ⍳¨ используется монадически и принимает в качестве своего правого операнда вектор 3 3. Левая область действия each завершается оператором reduce , обозначенным прямой косой чертой . Ее левый операнд — это функциональное выражение слева: внешнее произведение функции equals . Результат ∘.=/ — монадическая функция. С обычной длинной правой областью действия функции она принимает в качестве своего правого аргумента результат ⍳¨3 3. Таким образом,



Монадические функции

Имя(я)ОбозначениеЗначениеКодовая точка Unicode
Рулон?BОдно целое число, выбранное случайным образом из первых B целых чиселU+003F ? ВОПРОСИТЕЛЬНЫЙ ЗНАК
Потолок⌈BНаименьшее целое число, большее или равное BU+2308 ЛЕВЫЙ ПОТОЛОК
Пол⌊BНаибольшее целое число, меньшее или равное BU+230A ЛЕВЫЙ ЭТАЖ
Форма, Ро⍴BКоличество компонентов в каждом измерении BU+2374 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL RHO
Нет , Тильда∼BЛогический: ∼1 равно 0, ∼0 равно 1U+223C ОПЕРАТОР ТИЛЬДА
Абсолютное значение∣BВеличина BU+2223 ДЕЛИТ
Генератор индекса, Йота⍳BВектор первых B целых чиселU+2373 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ IOTA
Экспоненциальный⋆Bе в степени BU+22C6 ЗВЕЗДНЫЙ ОПЕРАТОР
Отрицание−BИзменяет знак BU+2212 ЗНАК МИНУС
Сопряженный+BКомплексное сопряжение B (действительные числа возвращаются без изменений)U+002B + ЗНАК ПЛЮС
Signum×B¯1, если В < 0; 0, если В = 0; 1, если В > 0U+00D7 × ЗНАК УМНОЖЕНИЯ
Взаимный÷B1 делится на BU+00F7 ÷ ЗНАК ДЕЛЕНИЯ
Расщепление, Склеивание, Ламинат,BПреобразует B в векторU+002C , ЗАПЯТАЯ
Обратная матрица , Монадическое четверное деление⌹BОбратная матрица BU+2339 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЧЕТЫРЕХМЕРНОЕ ДЕЛЕНИЕ
Пи умножить на○BУмножить на πU+25CB БЕЛЫЙ КРУГ
Логарифм⍟BНатуральный логарифм BU+235F APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ ЗВЕЗДА
Обратный ход⌽BОбратные элементы B вдоль последней осиU+233D APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ СТИЛЬ
Обратный ход⊖BОбратные элементы B вдоль первой осиU+2296 МИНУС В КРУГЕ
Повышение класса⍋BИндексы B, которые упорядочат B в порядке возрастанияU+234B ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ДЕЛЬТА СТИЛЬ
Понижение оценки⍒BИндексы B, которые упорядочат B в порядке убыванияU+2352 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ DEL STILE
Выполнять⍎BВыполнить выражение APLU+234E APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ DOWN TACK JOT
Монадический формат⍕BХарактерное представление BU+2355 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ UP TACK JOT
Монадическая транспонировка⍉BПоменять местами оси BU+2349 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КРУГ ОБРАТНАЯ КОСАЯ ЧЕРТА
Факториал!BПроизведение целых чисел от 1 до BU+0021 ! ВОСКЛИЦАТЕЛЬНЫЙ ЗНАК
Глубина≡BГлубина вложенности: 1 для невложенного массиваU+2261 ИДЕНТИЧНО
Стол⍪BПревращает B в таблицу, двумерный массив.U+236A APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЗАПЯТАЯ ШТРИХ

Двоичные функции

Имя(я)ОбозначениеЗначение
Кодовая точка Unicode
ДобавлятьA+BСумма А и ВU+002B + ЗНАК ПЛЮС
ВычитатьA−BА минус БU+2212 ЗНАК МИНУС
УмножитьA×BА умножить на ВU+00D7 × ЗНАК УМНОЖЕНИЯ
РазделятьA÷BА делится на ВU+00F7 ÷ ЗНАК ДЕЛЕНИЯ
Возведение в степеньA⋆BА возведено в степень ВU+22C6 ЗВЕЗДНЫЙ ОПЕРАТОР
КругA○BТригонометрические функции B , выбранные A
A =1: sin( B ) A =5: sinh( B ) A =2: cos( B ) A =6: cosh( B ) A =3: tan( B ) A =7: tanh( B )

Отрицательные значения производят обратные значения соответствующих функций.

U+25CB БЕЛЫЙ КРУГ
Иметь делоA?BA отдельных целых чисел, выбранных случайным образом из первых B целых чиселU+003F ? ВОПРОСИТЕЛЬНЫЙ ЗНАК
Членство, ЭпсилонA∈B1 для элементов A, присутствующих в B ; 0, если их нет.U+2208 ЭЛЕМЕНТ
Найти, Эпсилон UnderbarA⍷B1 для начальной точки многоэлементного массива A, присутствующего в B ; 0 — где нет.U+2377 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ЭПСИЛОН ПОДЧЕРКНУТЫЙ
Максимум , ПотолокA⌈BБольшее значение A или BU+2308 ЛЕВЫЙ ПОТОЛОК
Минимум , ПолA⌊BМеньшее значение A или BU+230A ЛЕВЫЙ ЭТАЖ
Изменение формы, Диадический РоA⍴BМассив формы A с данными BU+2374 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL RHO
БратьA↑BВыберите первый (или последний) элемент A из B в соответствии с × AU+2191 СТРЕЛКА ВВЕРХ
УронитьA↓BУдалить первый (или последний) элемент A из B в соответствии с × AU+2193 СТРЕЛКА ВНИЗ
РасшифроватьA⊥BЗначение многочлена, коэффициенты которого находятся в точке B и точке AU+22A5 ВВЕРХ
КодироватьA⊤BБаза представление значения BU+22A4 ВНИЗ
ОстатокA∣BB по модулю AU+2223 ДЕЛИТ
КатенацияA,BЭлементы B, добавленные к элементам AU+002C , ЗАПЯТАЯ
Расширение, Двойной обратный слэшA\BВставьте нули (или пробелы) в B, соответствующие нулям в A.U+005C \ ОБРАТНЫЙ СОЛИДУС
Сжатие, Двойной слэшA/BВыберите элементы в B, соответствующие элементам в A.U+002F / СОЛИДУС
Индекс, Диадическая ЙотаA⍳BМестоположение (индекс) B в A ; если не найдено1+⍴AU+2373 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ IOTA
Матричное деление, Диадическое четверное делениеA⌹BРешение системы линейных уравнений , множественная регрессия A x = BU+2339 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЧЕТЫРЕХМЕРНОЕ ДЕЛЕНИЕ
ВращениеA⌽BЭлементы B повернуты на позиции AU+233D APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ СТИЛЬ
ВращениеA⊖BЭлементы B повернуты на A позиций вдоль первой осиU+2296 МИНУС В КРУГЕ
ЛогарифмA⍟BЛогарифм B по основанию AU+235F APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ ЗВЕЗДА
Диадический форматA⍕BФормат B в матрицу символов согласно AU+2355 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ UP TACK JOT
Общая транспонировкаA⍉BОси B упорядочены по AU+2349 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КРУГ ОБРАТНАЯ КОСАЯ ЧЕРТА
КомбинацииA!BКоличество комбинаций B, взятых A за разU+0021 ! ВОСКЛИЦАТЕЛЬНЫЙ ЗНАК
Диерезис, Диерезис, Двойная точкаA¨BНад каждым или выполнять каждое по отдельности; B = над ними; A = операция по выполнению или с использованием (например, йоты)U+00A8 ¨ ДИАЭРЕЗИС
Меньше, чемA<BСравнение: 1, если верно, 0, если неверноU+003C < ЗНАК «МЕНЬШЕ»
Меньше или равноA≤BСравнение: 1, если верно, 0, если неверноU+2264 МЕНЬШЕ ИЛИ РАВНО
РавныйA=BСравнение: 1, если верно, 0, если неверноU+003D = ЗНАК РАВЕНСТВА
Больше или равноA≥BСравнение: 1, если верно, 0, если неверноU+2265 БОЛЬШЕ ИЛИ РАВНО
Больше чемA>BСравнение: 1, если верно, 0, если неверноU+003E > ЗНАК БОЛЬШЕ
Не равныA≠BСравнение: 1, если верно, 0, если неверноU+2260 НЕ РАВНО
ИлиA∨BБулева логика: 0 (Ложь), если и A , и B = 0 , 1 в противном случае. Альтернатива: 1 (Истина), если A или B = 1 (Истина)U+2228 ЛОГИЧЕСКОЕ ИЛИ
ИA∧BБулева логика: 1 (Истина), если и A , и B = 1 , 0 (Ложь) в противном случаеU+2227 ЛОГИЧЕСКОЕ И
НиA⍱BБулева логика: 1, если и A , и B равны 0, в противном случае 0. Alt: ~∨ = не ИЛИU+2371 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КАРЕТ ТИЛЬДА ВНИЗ
НандA⍲BБулева логика: 0, если и A , и B равны 1, в противном случае 1. Alt: ~∧ = не ИU+2372 APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ВВЕРХ КАРЕТ ТИЛЬДА
ЛевыйA⊣BАU+22A3 ЛЕВЫЙ ГАЛС
ВерноA⊢BБU+22A2 ПРАВЫЙ ГАЛС
СоответствоватьA≡B0, если A не соответствует B в точности по значению, форме и вложенности; в противном случае 1.U+2261 ИДЕНТИЧНО
ЛаминатA⍪BОбъединить вдоль первой осиU+236A APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЗАПЯТАЯ ШТРИХ

Операторы и индикатор оси

Имя(я)СимволПримерЗначение (примера)Последовательность кодовых точек Unicode
Уменьшить (последняя ось), Косая черта/+/BСумма по BU+002F / СОЛИДУС
Уменьшить (первая ось)+⌿BСумма вниз BU+233F ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КОСА
Сканирование (последняя ось), обратная косая черта\+\BТекущая сумма по BU+005C \ ОБРАТНЫЙ СОЛИДУС
Сканирование (первая ось)+⍀BТекущая сумма вниз BU+2340 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ОБРАТНАЯ КОСАЯ ЧЕРТА
Внутренний продукт.A+.×BМатричное произведение A и BU+002E . ТОЧКА
Внешний продукт∘.A∘.×BВнешний продукт A и BU+2218 ОПЕРАТОР КОЛЬЦА , U+002E . ТОЧКА

Примечания: Операторы reduce и scan ожидают диадическую функцию слева, образуя монадическую составную функцию, примененную к вектору справа.

Оператор произведения "." ожидает диадическую функцию слева и справа, образуя диадическую составную функцию, примененную к векторам слева и справа. Если функция слева от точки - "∘" (обозначающая ноль), то составная функция является внешним произведением, в противном случае это внутреннее произведение. Внутреннее произведение, предназначенное для обычного умножения матриц, использует функции + и ×, замена их другими диадическими функциями может привести к полезным альтернативным операциям.

За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т. е. он появляется между функцией и массивом и его не следует путать с индексами массива, написанными после массива. Например, если задана функция ⌽ (реверс) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:


В частном случае, если за функцией диадической катенаты "," следует индикатор оси (или модификатор оси для символа/функции), ее можно использовать для ламинирования (вставки) двух массивов в зависимости от того, меньше или больше индикатор оси, чем начало координат индекса [8] (начало координат индекса = 1 на иллюстрации ниже):

Вложенные массивы

Массивы — это структуры, элементы которых сгруппированы линейно как векторы или в табличной форме как матрицы — и более высокие измерения (3D или кубические, 4D или кубические по времени и т. д.). Массивы, содержащие как символы, так и числа, называются смешанными массивами . [9] Структуры массивов, содержащие элементы, которые также являются массивами, называются вложенными массивами . [10]

Создание вложенного массива
Пользовательский сеанс с интерпретатором APLОбъяснение
 X 4 5 ⍴⍳ 20 X 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 X [ 2 ; 2 ] 7 ⎕IO 1 X [ 1 ; 1 ] 1                       


X set = матрица с 4 строками и 5 столбцами, состоящая из 20 последовательных целых чисел.

Элемент X[2;2] в строке 2 - столбце 2 в настоящее время представляет собой целое число = 7 .

Начальное происхождение индекса ⎕Значение IO = 1 .

Таким образом, первый элемент в матрице X или X[1;1] = 1 .

 X [ 2 ; 2 ] "Текст" X [ 3 ; 4 ] ( 2 2 ⍴⍳ 4 ) X 1 2 3 4 5 6 Текст 8 9 10              11 12 13 1 2 15 3 4        16 17 18 19 20    
Элемент в X[строка 2; столбец 2] изменяется (с 7) на вложенный вектор «Текст» с помощью функции enclose ⊂ .


Элемент в X[строка 3; столбец 4], ранее целочисленный 14, теперь становится мини- вложенной или ⊂ вложенной матрицей 2x2 из 4 последовательных целых чисел.

Поскольку X содержит числа , текст и вложенные элементы , он является как смешанным , так и вложенным массивом.

Визуальное представление вложенного массива

Управление потоком

Пользователь может определять пользовательские функции , которые, как и переменные, идентифицируются по имени , а не по нетекстовому символу. Заголовок функции определяет , является ли пользовательская функция ниладической (без аргументов), монадической (один правый аргумент) или диадической (левый и правый аргументы), локальное имя результата ( слева от стрелки назначения ← ) и имеет ли она какие-либо локальные переменные (каждая из которых разделена точкой с запятой ';').

Пользовательские функции
Ниладическая функция PI или π(pi)Монадическая функция CIRCLEAREAДвоичная функция SEGMENTAREA с локальными переменными
 РЕЗУЛЬТАТ ПИ РЕЗУЛЬТАТ 1    
 ПЛОЩАДЬ ОКРУГПЛОЩАДЬ РАДИУС ПЛОЩАДЬ ПИ × РАДИУС 2     
 ПЛОЩАДЬ ГРАДУСЫ СЕГМЕНТАРНЫЙ РАДИУС ; ФРАКЦИЯ ; CA ДОЛЯ ГРАДУСЫ ÷ 360 CA КРУГЛОСТЬ РАДИУС ПЛОЩАДЬ ДРОБЬ × CA             

Являются ли функции с одинаковым идентификатором, но разной адичностью различными, определяется реализацией. Если это разрешено, то функция CURVEAREA может быть определена дважды для замены как монадической CIRCLEAREA, так и диадической SEGMENTAREA выше, при этом монадическая или диадическая функция выбирается контекстом, в котором на нее ссылаются.

Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, то есть массивы должны иметь одинаковое количество элементов или один из них должен иметь один элемент, который расширен. Существуют исключения из этого правила, например, функция для преобразования додесятичной валюты Великобритании в доллары будет ожидать принятия параметра с ровно тремя элементами, представляющими фунты, шиллинги и пенсы. [11]

Внутри программы или пользовательской функции управление может быть условно передано оператору, идентифицированному номером строки или явной меткой; если цель равна 0 (нулю), это завершает программу или возвращает вызывающему функцию. Наиболее распространенная форма использует функцию сжатия APL, как в шаблоне (условии)/цели, которая имеет эффект оценки условия до 0 (ложь) или 1 (истина), а затем использует это для маскировки цели (если условие ложно, оно игнорируется, если истинно, оно остается в покое, поэтому управление передается).

Следовательно, функцию SEGMENTAREA можно модифицировать так, чтобы она прерывалась (чуть ниже), возвращая ноль, если параметры (DEGREES и RADIUS ниже) имеют разные знаки:

ПЛОЩАДЬ ГРАДУСЫ СЕГМЕНТАРИЯ РАДИУС ; ДРОБЬ ; CA ; ЗНАК ⍝ локальные переменные обозначены точкой с запятой(;) ДРОБЬ ГРАДУСЫ ÷ 360 CA CIRCLEAREA РАДИУС ⍝ этот оператор кода APL вызывает пользовательскую функцию CIRCLEAREA, определенную выше. ЗНАК ( × ГРАДУСЫ ) ≠× РАДИУС ⍝ << APL логика ТЕСТ/определить, имеют ли ГРАДУСЫ и РАДИУС НЕ (используется ≠) одинаковый ЗНАК 1-да, отличается (≠), 0-нет (одинаковый знак) ПЛОЩАДЬ 0 ⍝ значение по умолчанию ПЛОЩАДИ установлено = ноль ЗНАК / 0 ⍝ ветвление (здесь выход) происходит, когда ЗНАК=1, в то время как ЗНАК=0 НЕ переходит к 0. Переход к 0 выходит из функции. ПЛОЩАДЬ ДРОБЬ × CA                      

Вышеуказанная функция SEGMENTAREA работает так, как и ожидалось, если параметры являются скалярами или одноэлементными массивами , но не если они являются многоэлементными массивами , поскольку условие в конечном итоге основывается на одном элементе массива SIGN - с другой стороны, пользовательская функция может быть изменена для правильной обработки векторизованных аргументов. Операция иногда может быть непредсказуемой, поскольку APL определяет, что компьютеры с возможностями векторной обработки должны распараллеливать и могут переупорядочивать операции с массивами, насколько это возможно - таким образом, тестируйте и отлаживайте пользовательские функции, особенно если они будут использоваться с векторными или даже матричными аргументами. Это влияет не только на явное применение пользовательской функции к массивам, но и на ее использование в любом месте, где может быть разумно использована диадическая функция, например, при генерации таблицы результатов:

 90 180 270 ¯90 ∘. SEGMENTAREA 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0               

Более краткий способ, а иногда и лучший способ - сформулировать функцию - избегать явных передач управления, вместо этого используя выражения, которые вычисляются правильно во всех или ожидаемых условиях. Иногда правильно позволить функции завершиться неудачей, когда один или оба входных аргумента неверны - именно для того, чтобы дать пользователю знать, что один или оба использованных аргумента были неверны. Следующий пример более краток, чем функция SEGMENTAREA выше. Следующий пример, что важно, правильно обрабатывает векторизованные аргументы:

 ПЛОЩАДЬ ГРАДУСЫ СЕГМЕНТАРИЙ РАДИУС ; ДРОБЬ ; CA ; ЗНАК ДРОБЬ ГРАДУСЫ ÷ 360 CA ОКРУЖНОСТЬ РАДИУС ЗНАК ( × ГРАДУСЫ ) × РАДИУС ПЛОЩАДЬ ДРОБЬ × CA ×~ ЗНАК ⍝ это выражение APL более сложное, как однострочное, но оно решает векторизованные аргументы: компромисс - сложность против ветвления                  90 180 270 ¯90 ∘. SEGMENTAREA 1 ¯2 4 0,785398163 0 12,5663706 1,57079633 0 25,1327412 2,35619449 0 37,6991118 0 ¯3,14159265 0               

Избегание явных передач управления, также называемых ветвлением, если не рассматривать или тщательно не контролировать, может способствовать использованию чрезмерно сложных однострочников , поистине «непонятых и сложных идиом» и стиля «только для записи», что мало способствовало тому, чтобы расположить к APL влиятельных комментаторов, таких как Эдсгер Дейкстра . [12] Однако, с другой стороны, идиомы APL могут быть забавными, познавательными и полезными — если использовать их с полезными комментариями ⍝ , например, включая исходное и предполагаемое значение и функцию идиомы(ий). Вот список идиом APL, список идиом IBM APL2 здесь [13] и финская библиотека идиом APL здесь.

Разнообразный

Разные символы
Имя(я)СимволПримерЗначение (примера)Кодовая точка Unicode
Высокий минус [14]¯¯3Обозначает отрицательное число.U+00AF ¯ МАКРОН
Лампа, Комментарий⍝This is a commentВсе, что справа от ⍝, обозначает комментарий.U+235D APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ UP SHOE JOT
Стрелка вправо, Ветка, Перейти→This_Label→This_Label отправляет выполнение APL в This_Label:U+2192 СТРЕЛКА ВПРАВО
Назначить, Стрелка влево, УстановитьB←AB←A устанавливает значения и форму B для соответствия AU+2190 СТРЕЛКА ВЛЕВО

Большинство реализаций APL поддерживают ряд системных переменных и функций, которым обычно предшествует символ ⎕ (quad) и/или ")" ( hook = закрывающая скобка). Обратите внимание, что символ quad не совпадает с символом отсутствующего символа Unicode . Особенно важна и широко реализована переменная ⎕IO ( Index Origin ), поскольку в то время как оригинальный IBM APL основывал свои массивы на 1, некоторые более новые варианты основывают их на нуле:

Пользовательский сеанс с интерпретатором APLОписание
 X 12 X 1 2 3 4 5 6 7 8 9 10 11 12 ⎕IO 1 X [ 1 ] 1              

X set = вектор из 12 последовательных целых чисел.

Начальное начало индекса ⎕значение йоты = 1. Таким образом, первая позиция в векторе X или X[1] = 1 на вектор значений йоты { 1 2 3 4 5 ...}.

 ⎕IO 0 X [ 1 ] 2 X [ 0 ] 1  
Начало индекса ⎕IO теперь изменено на 0. Таким образом, «первая позиция индекса» в векторе X изменяется с 1 на 0. Следовательно, X[1] затем ссылается или указывает на 2 из {1 2 3 4 5 ...}, а X[0] теперь ссылается на 1 .
 ⎕WA 41226371072
Quad WA или ⎕WA , еще одна динамическая системная переменная , показывает, сколько рабочей области остается неиспользованной или 41 226 мегабайт или около 41 гигабайта неиспользованной дополнительной общей свободной рабочей области, доступной для рабочего пространства APL и программы для обработки. Если это число становится низким или приближается к нулю - компьютеру может потребоваться больше оперативной памяти (ОЗУ), места на жестком диске или некоторая комбинация этих двух для увеличения виртуальной памяти .
 ) ВАРС X
)VARS — системная функция в APL, [15] )VARS показывает имена пользовательских переменных, существующих в текущей рабочей области.

Пользователям также доступны системные функции для сохранения текущего рабочего пространства, например, )SAVE , и завершения среды APL, например, )OFF — иногда называемые командами или функциями хука из-за использования ведущей правой скобки или хука. [16] Существует некоторая стандартизация этих функций квадро и хука.

Шрифты

Unicode Basic Multilingual Plane включает символы APL в блоке Miscellaneous Technical [17] , которые, таким образом, обычно точно отображаются из более крупных шрифтов Unicode, установленных в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Поэтому, хотя глифы и точны, они могут показаться незнакомыми программистам APL или их будет трудно отличить друг от друга.

Некоторые шрифты Unicode были разработаны для хорошего отображения APL: APLX Upright, APL385 Unicode и SimPL.

До появления Unicode интерпретаторы APL поставлялись со шрифтами, в которых символы APL отображались в менее часто используемых позициях в наборах символов ASCII, обычно в верхних 128 кодовых точках. Эти отображения (и их национальные вариации) иногда были уникальными для интерпретатора каждого поставщика APL, что делало отображение программ APL в Интернете, в текстовых файлах и руководствах - часто проблематичным.

Функция клавиатуры APL2 для сопоставления символов

Клавиатура APL2
Клавиатура APL2

Обратите внимание на клавишу APL On/Off — самую верхнюю правую клавишу, чуть ниже. Также обратите внимание, что на клавиатуре было около 55 уникальных (68 перечислены в таблицах выше, включая сравнительные символы, но несколько символов появляются как в монадических, так и в диадических таблицах) клавиш символов APL (55 функций APL (операторов) перечислены в справочном руководстве IBM 5110 APL), таким образом, с использованием клавиш alt, shift и ctrl — теоретически это позволило бы максимум около 59 (клавиш) *4 (при нажатии двух клавиш) *3 (при нажатии трех клавиш, например, ctrl-alt-del) или около 472 различных максимальных комбинаций клавиш, приближаясь к максимуму в 512 символов EBCDIC (256 символов умножить на 2 кода для каждой комбинации клавиш). Опять же, теоретически клавиатура, изображенная здесь, позволила бы вводить с клавиатуры около 472 различных символов/функций APL, активно используемых. На практике ранние версии использовали только что-то примерно эквивалентное 55 специальным символам APL (исключая буквы, цифры, знаки препинания и т. д.). Таким образом, ранний APL тогда использовал только около 11% (55/472) потенциала использования символьного языка на тот момент, исходя из ограничений на количество клавиш клавиатуры, опять же исключая цифры, буквы, знаки препинания и т. д. В другом смысле использование символов клавиатуры было ближе к 100%, что было очень эффективно, поскольку EBCDIC допускал только 256 различных символов, а ASCII только 128.

Решение головоломок

APL оказался чрезвычайно полезным при решении математических головоломок, некоторые из которых описаны ниже.

Треугольник Паскаля

Возьмем треугольник Паскаля , который представляет собой треугольный массив чисел, в котором числа на концах строк равны 1, а каждое из остальных чисел равно сумме двух ближайших чисел в строке, расположенной прямо над ним (вершина, 1, находится наверху). Ниже приведена однострочная функция APL для визуального отображения треугольника Паскаля:

 Pascal { 0 ~ ¨⍨ a ⌽⊃⌽∊ ¨ 0 , ¨¨ a ! ¨ a ⌽⍳ } ⍝ Создать однострочную пользовательскую функцию с именем Pascal Pascal 7 ⍝ Запустить функцию Pascal для семи строк и показать результаты ниже: 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 35 35 21 7                                      

Простые числа, контрдоказательство через множители

Определите количество простых чисел (простое число — это натуральное число, большее 1 , которое не имеет положительных делителей, кроме 1 и самого себя) до некоторого числа N. Кену Айверсону приписывают следующее однострочное решение этой задачи на языке APL:

 ⎕CR 'PrimeNumbers' ⍝ Показать пользовательскую функцию APL PrimeNumbers Primes PrimeNumbers N ⍝ Функция принимает один правый аргумент N (например, показать простые числа для 1 ... int N) Primes ( 2 =+ 0 = ( N ) ∘. |⍳ N ) / N ⍝ Однострочник Кена Айверсона PrimeNumbers 100 ⍝ Показать все простые числа от 1 до 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 PrimeNumbers 100 25 ⍝ В списке двадцать пять простых чисел диапазон до 100.                                   

Часто требуется изучить обратное или противоположное математическому решению ( целые множители числа ): Докажите для подмножества целых чисел от 1 до 15, что они не являются простыми, перечислив их множители разложения . Каковы их неединичные множители (числа, делящиеся на, кроме 1)?

 ⎕CR 'ProveNonPrime' Z ProveNonPrime R ⍝Показать все множители целого числа R - за исключением 1 и самого числа, ⍝ т.е. доказать непростость. Для простого целого числа возвращается строка 'prime'. Z ( 0 = ( R ) | R ) / R ⍝ Определить все множители для целого числа R, сохранить в Z Z ( ~ ( Z 1 , R )) / Z ⍝ Удалить 1 и число как множители для числа из Z. ( 0 =⍴ Z ) / ProveNonPrimeIsPrime ⍝ Если результат имеет нулевую форму, у него нет других множителей и, следовательно, он является простым Z R , ( " множители (кроме 1) " ) , ( Z ) , ⎕TCNL ⍝ Показать число R, его множители (кроме 1, самого себя) и новую строку char 0 ⍝ Готово с функцией, если не простое ProveNonPrimeIsPrime : Z R , ( " prime" ) , ⎕TCNL ⍝ функция разветвляется здесь, если число было простым          ProveNonPrime ¨ 15 ⍝ Докажите, что числа не являются простыми, для каждого из целых чисел от 1 до 15 (йота 15) 1 простое число 2 простое число 3 простое число 4 множители ( кроме 1 ) 2 5 простое число 6 множители ( кроме 1 ) 2 3 7 простое число 8 множители ( кроме 1 ) 2 4 9 множители ( кроме 1 ) 3 10 множители ( кроме 1 ) 2 5 11 простое число 12 множители ( кроме 1 ) 2 3 4 6 13 простое число 14 множители ( кроме 1 ) 2 7 15 множители ( кроме 1 ) 3 5                                                               

Последовательность Фибоначчи

Создайте последовательность чисел Фибоначчи , где каждое последующее число в последовательности является суммой двух предыдущих:

 ⎕CR 'Fibonacci' ⍝ Отображение функции Фибоначчи FibonacciNum Фибоначчи Nth ; IOwas ⍝ Заголовок функции, имя функции = Fibonacci, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число. ⍝Создание последовательности чисел Фибоначчи, где Nth — номер позиции числа Фибоначчи в последовательности. << описание функции IOwas ⎕IO ⎕IO 0 FibonacciNum 0 1 ↓↑+ . × / Nth / 2 2 1 1 1 0 ⎕IO IOwas ⍝ Для правильной работы этой функции ⎕IO необходимо установить в ноль.                 Фибоначчи ¨ 14 ⍝ Это выражение APL гласит: Сгенерировать последовательность Фибоначчи для каждого (¨) целого числа (йота или ⍳) для целых чисел 1..14. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Сгенерированная последовательность, т. е. последовательность чисел Фибоначчи, сгенерированная интерпретатором APL.               

Дальнейшее чтение

  • Поливка, Рэймонд П.; Пакин, Сандра (1975). APL: Язык и его использование . Prentice-Hall. ISBN 978-0-13-038885-8.
  • Рейтер, Клиффорд А.; Джонс, Уильям Р. (1990). APL с математическим акцентом (1-е изд.). Тейлор и Фрэнсис. ISBN 978-0534128647.
  • Томпсон, Норман Д.; Поливка, Рэймонд П. (2013). APL2 in Depth (Springer Series in Statistics) (Мягкая обложка) (Перепечатка оригинального 1-го издания). Springer. ISBN 978-0387942131.
  • Гилман, Леонард; Роуз, Аллен Дж. (1976). APL: Интерактивный подход (мягкая обложка) (3-е изд.). Wiley. ISBN 978-0471093046.

Смотрите также

Ссылки

  1. ^ Айверсон, Кеннет Э. (1962-01-01). "Язык программирования". Труды весенней совместной компьютерной конференции 1-3 мая 1962 г. по - AIEE-IRE '62 (весна) . Нью-Йорк, США: ACM. стр. 345–351. doi : 10.1145/1460833.1460872 . S2CID  11777029.
  2. ^ Баронет, Дэн. "Операторы Sharp APL". archive.vector.org.uk . Vector - Журнал Британской ассоциации APL . Получено 13 января 2015 г. .
  3. ^ MicroAPL. "Примитивные операторы". www.microapl.co.uk . MicroAPL . Получено 13 января 2015 г. .
  4. ^ MicroAPL. "Операторы". www.microapl.co.uk . MicroAPL . Получено 13 января 2015 г. .
  5. ^ Progopedia. "APL". progopedia.com . Progopedia . Получено 13 января 2015 г. .
  6. ^ Dyalog. "D-функции и операторы, свободно сгруппированные в категории". dfns.dyalog.com . Dyalog . Получено 13 января 2015 г. .
  7. ^ IBM. "IBM 5100 APL Reference Manual" (PDF) . bitsavers.trailing-edge.com . IBM. Архивировано из оригинала (PDF) 14 января 2015 г. . Получено 14 января 2015 г. .
  8. ^ Браун, Джим (1978). «В защиту индекса происхождения 0». ACM SIGAPL APL Quote Quad . 9 (2): 7. doi : 10.1145/586050.586053 . S2CID  40187000.
  9. ^ MicroAPL. "APLX Language Manual" (PDF) . www.microapl.co.uk . MicroAPL - Версия 5 .0 Июнь 2009. стр. 22 . Получено 31 января 2015 г. .
  10. ^ Бенкард, Дж. Филип (1992). "Вложенные массивы и операторы: некоторые вопросы в глубину". Труды международной конференции по APL - APL '92 . Том 23. С. 7–21. doi : 10.1145/144045.144065 . ISBN 978-0897914772. S2CID  7760410. {{cite book}}: |journal=проигнорировано ( помощь )
  11. ^ Берри, Пол «APL\360 Primer Student Text», IBM Research, Исследовательский центр Томаса Дж. Уотсона, 1969.
  12. ^ "Трактат" (PDF) . www.cs.utexas.edu . Получено 2019-09-10 .
  13. ^ Кейсон, Стэн (13 мая 2006 г.). "Библиотека идиом APL2". www-01.ibm.com . IBM . Получено 1 февраля 2015 г. .
  14. ^ «Высокий минус» в APL применяется к одному числу, которое следует за ним, в то время как монадическая функция минуса изменяет знак всего массива справа.
  15. ^ "Рабочая область - Системные функции". Microapl.co.uk. стр. (внизу веб-страницы) . Получено 2018-11-05 .
  16. ^ "Справочник языка APL" (PDF) . Получено 2018-11-05 .
  17. ^ Таблица Unicode «Разное техническое (включая APL)» (PDF) .
  • Ссылка на символ APL: Страница 1, Страница 2, Страница 3, Страница 4
  • Страница шрифтов Британской ассоциации APL
  • Кодовая страница IBM 293, также известная как кодовая страница APL на мэйнфреймах
  • Общая информация о символах APL на вики APL
  • расширение APL и его клавиатурных символов-операторов.
  • Ли, Кса. "Как создать раскладку клавиатуры APL или математических символов" . Получено 13 января 2015 г. .

Общие онлайн-уроки

  • Практическое введение в APL 1 и APL 2 Грэма Дональда Робертсона
  • APL для ПК, серверов и планшетов — полнофункциональный NARS, без ограничений, бесплатная загрузка APL/2 с вложенными массивами от Sudley Place Software
  • GNU APL бесплатный загружаемый интерпретатор для APL от Юргена Зауэрманна
  • Обучающие видео на YouTube APL, загруженные Джимином Паком, 8 вводных/начальных обучающих видео.
  • Список учебных пособий, составленный SIGAPL
  • Изучите APL: Учебное пособие по APL от MicroAPL

Правила синтаксиса

  • Игра жизни Конвея в APL на YouTube
  • Айверсон, Кеннет Э. (1983). "Синтаксис и семантика APL". Труды международной конференции по APL - APL '83 . Том 13. С. 223–231. doi : 10.1145/800062.801221 . ISBN 978-0897910958. S2CID  16511283. {{cite book}}: |journal=проигнорировано ( помощь )
  • Gffer, M. (1989). "Будущий APL: Примеры и проблемы". Труды конференции по APL как инструменту мышления - APL '89 . Том 19. С. 158–163. doi : 10.1145/75144.75166 . ISBN 978-0897913270. S2CID  6011221. {{cite book}}: |journal=проигнорировано ( помощь )
Взято с "https://en.wikipedia.org/w/index.php?title=APL_syntax_and_symbols&oldid=1189722966"