Язык программирования APL отличается тем, что является символическим, а не лексическим: его примитивы обозначаются символами, а не словами. Эти символы изначально были разработаны как математическая нотация для описания алгоритмов. Программисты APL часто назначают неформальные имена при обсуждении функций и операторов (например, продукт для × /), но основные функции и операторы, предоставляемые языком, обозначаются нетекстовыми символами.
Большинство символов обозначают функции или операторы. Монадическая функция принимает в качестве аргумента результат оценки всего, что находится справа. (Модерируется обычным образом круглыми скобками.) У диадической функции есть еще один аргумент, первый элемент данных слева от нее. Многие символы обозначают как монадические, так и диадические функции, интерпретируемые в зависимости от использования. Например, ⌊3,2 дает 3, наибольшее целое число, не превышающее аргумент, а 3⌊2 дает 2, меньшее из двух аргументов.
APL использует термин оператор в смысле Хевисайда как модератор функции, в отличие от использования того же термина в других языках программирования, как то, что работает с данными, исх. оператор отношения и обычно операторы. Другие языки программирования также иногда используют этот термин как синоним функции, однако оба термина используются в APL более точно. Ранние определения символов APL были очень конкретными в отношении того, как символы классифицируются. Например, оператор reduce обозначается косой чертой и сокращает массив вдоль одной оси, вставляя его функциональный операнд. Пример сокращения :
× / 2 3 4 24 | << Эквивалент приводит к APL>> << оператору уменьшения/, используемому слева | 2 × 3 × 4 24 |
В приведенном выше случае оператор reduceили косая чертамодерирует функцию умножения. Выражение × / 2 3 4оценивается как скалярный (только 1 элемент) результат посредством уменьшениямассива путем умножения. Приведенный выше случай упрощен: представьте себе умножение (сложение, вычитание или деление) большего, чем просто нескольких чисел вместе. (Из вектора × /возвращает произведение всех его элементов.)
1 0 1 \ 45 67 45 0 67 | << Напротив приводит к APL>> << Развернутьдиадическая функция \используется слева Уменьшитьдиадическая функция /используется справа>> | 1 0 1/45 0 67 45 67 |
Приведенные выше примеры диадических функций [левый и правый примеры] (с использованием одного и того же символа /, правый пример) демонстрируют, как логические значения (0 и 1) могут использоваться в качестве левых аргументов для функций \ expandи / replicateдля получения прямо противоположных результатов. Слева 2-элементвектор {45 67} является расширенным, где логические 0 приводят к 3-элементномувектор {45 0 67} - обратите внимание, как APL вставил 0 в вектор. И наоборот, с правой стороны происходит прямо противоположное - где 3-элементный вектор становится 2-элементным; логические 0 удаляют элементы с помощью двоичной функции / косой черты. Символы APL также работают со списками (вектор) элементов, использующих типы данных, отличные от числовых, например, двухэлементный вектор символьных строк {"Яблоки" "Апельсины"} может быть заменен числовым вектором { 45 67} выше.
В APL нет иерархии приоритета для функций или операторов. APL не следует обычному приоритету операторов других языков программирования; например, ×
не связывает свои операнды более "жестко", чем +
. Вместо приоритета оператора APL определяет понятие области действия.
Область действия функции определяет ее аргументы. Функции давно имеют правильную область видимости: то есть они принимают в качестве правильных аргументов все, что находится справа. Диадическая функция имеет короткую левую область видимости: она принимает в качестве своих левых аргументов первую часть данных слева. Например, (крайний левый столбец ниже - это фактический программный код из пользовательского сеанса APL , с отступом = фактический пользовательский ввод, без отступа = результат, возвращенный Интерпретатор APL ):
1 ÷ 2 ⌊ 3 × 4 - 5 ¯0,3333333333 1 ÷ 2 ⌊ 3 × ¯1 ¯0,3333333333 1 ÷ 2 ⌊ ¯3 ¯0,3333333333 1 ÷ ¯3 ¯0,3333333333 | << First note there are no parentheses and Шаг 2) 3 раза -1 = -3. |
Оператор может иметь функцию или данные операнды и оценивать двоичную или монадическую функцию. Операторы давно покинули сферу деятельности. Оператор принимает в качестве левого операнда самую длинную функцию слева от него. Например:
∘. = / ⍳¨3 3 1 0 0 0 1 0 0 0 1 | APL атомарный или частичный субанализ (полное объяснение): диэрезис ¨или двойная мини-точка означает повторение или для каждогоили выполнение каждого отдельно, поэтому йота повторяется(у человека, т. Е. Обратное термины, интерпретатор APL читает 3 3 на каждую йоту использования), кратко: йота для каждых 3. |
Левый операнд для для каждого оператора¨
- это индекс ⍳функция. Производная функция ⍳¨
используется монадически и принимает в качестве своего правого операнда вектор 3 3
. Левая область видимости каждогозавершается оператором reduce, обозначенным прямой косой чертой. Его левый операнд - это выражение функции слева от него: внешний продукт функции равен. Результат ∘. = / Является монадической функцией. При обычной длинной правой области видимости функции она принимает в качестве своего правого аргумента результат 3 3. Таким образом,
(⍳3) (⍳3)1 2 3 1 2 3 (⍳3) ∘. = ⍳31 0 0 0 1 0 0 0 1 ⍳¨3 3 1 2 3 1 2 3 ∘. = / ⍳¨3 31 0 0 0 1 0 0 0 1 |
Матрица единиц и нулей, полученная аналогично по ∘. = / ⍳¨3 3и (⍳3)∘.=⍳3называется тождеством матрица. Матрицы идентичности полезны при решении определителей матрицы, групп линейных уравнений и множественной регрессии. |
im ← ∘. = ⍨∘⍳ im 3 1 0 0 0 1 0 0 0 1 | Некоторые интерпретаторы APL поддерживают оператор compose ∘и оператор коммутировать ⍨. Первый ∘ склеивает функциивместе, так что foo∘bar , например, может быть гипотетической функцией, которая применяет определенную функцию foo к результату определенной панели функций ; foo и bar могут представлять любую существующую функцию. В случаях, когда диадическая функция модерируется коммутируют, а затем используется монадически, ее правый аргумент также принимается как ее левый аргумент. Таким образом, производная от или составная функция(названная im слева) используется в пользовательском сеансе APL для возврата 9- элементной матрицы идентичности с использованием ее правого аргумент, параметр или операнд = 3. |
Буквы ← «ABCDE» Буквы ABCDE ⍴Буквы 5 FindIt ← «CABS» FindIt CABS ⍴FindIt 4 буквы ⍳ FindIt 3 1 2 6 | Пример использования APL для индекса ⍳или найти элементы(или не найти) в векторе символов : Сначала переменной Lettersприсваивается вектор 5 элементов, в данном случае - буквы алфавита. Форма ⍴или длина вектора символов буквравна 5. Переменной FindItназначается то, что найдитев буквах, и его длина составляет 4 символа. 1 2 3 4 5 << vector positions or index #'s in Буквы Слева двоичная функция iota ищетчерез свой левый аргумент (Буквы) для строка поиска (правый аргумент йоты, FindIt). Iota находит букву "C" в позиции 3 в буквах, она находит "A" в позиции 1 и "B" в позиции 2. Iotaне не находитбуква «S» в любом месте переменной Letters, поэтому она возвращает число 6, которое на 1 больше, чем длинабукв. Iotaобнаружил буквы "CAB" (3 1 2). Йотаправильно сделал не нашел"S" (6). |
Имя (я) | Обозначение | Значение | Кодовая точка Unicode |
---|---|---|---|
Roll | ?B | Одно целое число, выбранное случайным образом из первого B целые числа | U + 003F? |
Потолок | ⌈B | Наименьшее целое число, большее или равное B | U + 2308 ⌈ |
Пол | ⌊B | Наибольшее целое число, меньшее или равное B | U + 230A ⌊ |
Форма, Rho | ⍴B | Количество компонентов в каждом измерении B | U + 2374 ⍴ |
Not, Тильда | ∼B | Логическое: ∼1 равно 0, ∼0 равно 1 | U + 223C ∼ |
Абсолютное значение | ∣B | Величина B | U + 2223 ∣ |
Генератор индекса, Iota | ⍳B | Вектор первых B целых чисел | U + 2373 ⍳ |
Экспонента | ⋆B | e в степени B | U + 22C6 ⋆ |
Отрицание | −B | Меняет знак B | U + 2212 - |
Идентичность | +B | Без изменений на B | U + 002B + |
Signum | ×B | ¯1, если B <0; 0 if B=0; 1 if B>0 | U + 00D7 × |
Взаимное | ÷B | 1, деленное на B | U + 00F7 ÷ |
Равель, Катенат, Ламинат | ,B | Преобразует B в вектор | U + 002C, |
Матрица, обратная, Monadic Quad Divide | ⌹B | , обратная матрице B | U + 2339 ⌹ |
Pi раз | ○B | Умножается на π | U + 25CB ○ |
Логарифм | ⍟B | Натуральный логарифм B | U + 235F ⍟ |
Реверс | ⌽B | Обратные элементы B по последней оси | U + 233D ⌽ |
R eversal | ⊖B | Обратные элементы B вдоль первой оси | U + 2296 ⊖ |
Повышение уровня | ⍋B | Указатели B, которые будут располагать B в порядке возрастания | U + 234B ⍋ |
Понижение уровня | ⍒B | Индексы B, которые упорядочивают B в порядке убывания | U + 2352 ⍒ |
Выполнить | ⍎B | Выполнить выражение APL | U + 234E ⍎ |
Монадический формат | ⍕B | Символьное представление B | U + 2355 ⍕ |
Монадический транспонировать | ⍉B | Поменять местами оси B | U + 2349 ⍉ |
Факториал | !B | Произведение целых чисел от 1 до B | U + 0021! |
Имя (я) | Обозначение | Значение | Кодовая точка Unicode |
---|---|---|---|
Добавить | A + B | Сумма A и B | U + 002B + |
Вычесть | A − B | A минус B | U + 2212 - |
Умножить | A × B | A умножить на B | U + 00D7 × |
Разделить | A ÷ B | A разделить на B | U + 00F7 ÷ |
Возведение в степень | A⋆B | 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? B | Отдельные целые числа, выбранные случайным образом из первых B целых чисел | U + 003F? |
Членство, Epsilon | A∈B | 1 для элементов A, присутствующих в B; 0 где нет. | U + 2208 ∈ |
Максимум, потолок | A⌈B | Большее значение A или B | U + 2308 ⌈ |
Минимум, этаж | A⌊B | Меньшее значение A или B | U + 230A ⌊ |
Reshape, Dyadic Rho | A⍴B | Массив формы A с данными B | U + 2374 ⍴ |
Take | A ↑ B | Выбрать первый (или последний) элемент A из B согласно × A | U + 2191 ↑ |
Drop | A ↓ B | Удалить первый (или последний) элемент A из B в соответствии с × A | U + 2193 ↓ |
Декодировать | A⊥B | Значение полинома, коэффициенты которого равны B в A | U + 22A5 ⊥ |
Кодировать | A⊤B | Представление Base-A значения B | U + 22A4 ⊤ |
Остаток | A∣B | B по модулю A | U + 2223 ∣ |
Связь | A, B | Элементы B, добавленные к элементам A | U + 002C, |
Expansion, Dyadic Backslash | A \ B | Вставить нули (или пробелы) в B, соответствующие нулям в A | U + 005C \ |
Сжатие, двойная косая черта | A / B | Выбрать элементы в B, соответствующие единицам в A | U + 002F / |
Указатель, D yadic Iota | A⍳B | Местоположение (индекс) B в A; 1 + ⍴A , если не найдено | U + 2373 ⍳ |
Матричное деление, двухквадратное деление | A⌹B | Решение системы линейных уравнений, множественная регрессия Ax = B | U + 2339 ⌹ |
Вращение | A⌽B | Элементы B вращаются в положениях A | U + 233D ⌽ |
Вращение | A⊖B | Элементы B вращаются в позиции A вдоль первой оси | U + 2296 ⊖ |
Логарифм | A⍟B | Логарифм B по основанию A | U + 235F ⍟ |
Диадический формат | A⍕B | Формат B в матрицу символов согласно A | U + 2355 23 |
Общее транспонирование | A⍉B | оси B упорядочены по A | U + 2349 ⍉ |
Комбинации | 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 ≠ |
Or | A∨ B | Логическая логика: 0(False), если иA, и B = 0, иначе 1. Alt: 1(True), если A илиB = 1(True) | U + 2228 ∨ |
И | A∧B | Логическая логика: 1(Истина), если иA , иB = 1, 0 (Ложь) в противном случае | U + 2227 ∧ |
Nor | A⍱B | Логическая логика: 1, если и A, и B равны 0, в противном случае 0. Alt: ~ not = нет Или | U + 2371 ⍱ |
Nand | A⍲B | Логическая логика: 0, если и A, и B равны 1, иначе 1. Alt: ~ ∧ = not And | U + 2372 ⍲ |
Left | A⊣B | A | U + 22A3 ⊣ |
справа | A⊢B | B | U + 22A2 ⊢ |
Имя (я) | Символ | Пример | Значение (пример) | Последовательность кодовых точек Unicode |
---|---|---|---|---|
Уменьшение (последняя ось), косая черта | / | + / B | Сумма по B | U + 002F / |
Уменьшение (первая ось) | ⌿ | + ⌿B | Суммирование B | U + 233F ⌿ |
Сканирование (последняя ось), обратная косая черта | \ | + \ B | Текущая сумма по B | U + 005C \ |
Сканирование (первая ось) | ⍀ | + ⍀B | Текущая сумма вниз B | U + 2340 ⍀ |
Внутреннее произведение | . | A +. × B | Матричный продукт из A и B | U + 002E. |
Внешний продукт | ∘. | A∘. × B | Внешний продукт из A и B | U + 2218 ∘ , U + 002E. |
Примечания:Операторы сокращения и сканирования ожидают, что слева от них будет двоичная функция, образуя монадическую составную функцию, применяемую к вектору справа.
Оператор произведения "." ожидает диадическую функцию как слева, так и справа, образуя диадическую составную функцию, применяемую к векторам слева и справа. Если функция слева от точки - «∘» (обозначающая ноль), то составная функция является внешним продуктом, в противном случае - внутренним продуктом. Внутренний продукт, предназначенный для обычного умножения матриц, использует функции + и ×, замена их другими двоичными функциями может привести к полезным альтернативным операциям.
За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т.е. он появляется между функцией и массивом, и его не следует путать с индексами массива, записанными после массива. Например, учитывая функцию ⌽ (разворот) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:
A ← 4 3⍴⍳12 A 1 2 3 4 5 6 7 8 9 10 11 12 ⌽A 3 2 1 6 5 4 9 8 7 12 11 10 ⌽ [1] A 10 11 12 7 8 9 4 5 6 1 2 3 ⊖⌽A 12 11 10 9 8 7 6 5 4 3 2 1 ⍉A 1 4 7 10 2 5 8 11 3 6 9 12 |
Aтеперь отражается или переворачивается вдоль вертикальной оси, как визуально указывает символ ⌽. Aтеперь отображается с помощью индикатора оси [1]или модификатора первого измерения. В результате переменная A была отражена по горизонтальной оси, а не по вертикали. Aтеперь отражается как по вертикали ⊖, и по по горизонтали ⌽. A- ⍉ транспонируетсяв матрицу 3 строки на 4 столбца, так что строки-столбцы меняются местами, как Символ ⍉отображает визуально. Сравните результат здесь с исходной матрицей, хранящейся в самой верхней матрице A. Эти типы преобразований данных полезны в анализе временных рядов и пространственных координатах, всего два примера, существуют и другие. |
В частном случае, если диадический catenate","за функцией следует индикатор оси (или модификатор оси для символа / функции), ее можно использовать для ламинирования (вставки) двух массивов в зависимости от того, меньше ли индикатор оси чем или больше чем начало индекса (начало индекса = 1 на иллюстрации ниже):
B ← 1 2 3 4 C ← 5 6 7 8 B, C 1 2 3 4 5 6 7 8 B , [0.5] C 1 2 3 4 5 6 7 8 B, [1.5] C 1 5 2 6 3 7 4 8 | Слева переменной 'B' сначала назначается вектор из 4 последовательных целых чисел (например, ⍳4). |
Массивы - это структуры, элементы которых сгруппированы линейно как векторы или в табличной форме как матрицы - и более высокие измерения (3D или кубы, 4D или куб с течением времени и т. Д.). Массивы, содержащие как символы, так и числа, называются смешанными массивами. Структуры массивов, содержащие элементы, которые также являются массивами, называются вложенными массивами.
Пользовательский сеанс с интерпретатором 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 [2; 2]в строке 2 - столбец 2 в настоящее время является целым числом = 7. Исходное начало индекса ⎕IOзначение = 1. Таким образом, первый элемент в матрице X или X [1; 1] = 1. |
X [2; 2] ← ⊂ "Text" 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; col 2] заменяется (с 7) на вложенный вектор «Текст» с помощью функции enclose ⊂. Элемент в X [строка 3; col 4], ранее целое число 14, теперь становится миниатюрной вложенной или вложенной матрицей2x2 из 4 последовательных целых чисел. Поскольку Xсодержит числа , текст и вложенные элементы , это как смешанный, так и вложенный массив. |
Пользователь может определять пользовательские функции, которые, как и переменные, идентифицируются по имени, а не нетекстовым символом. Заголовок функции определяет, является ли настраиваемая функция ниладической (без аргументов), монадической (один правый аргумент) или диадической (левый и правый аргументы), локальным именем результата (слева от стрелки ← назначить) и будет ли она имеет любые локальные переменные (каждая из которых разделена точкой с запятой ';').
Ниладская функция PI или π (pi) | Монадическая функция CIRCLEAREA | Двоичная функция SEGMENTAREA, с локальными переменными |
---|---|---|
∇ RESULT ← PI RESULT ← ○ 1 ∇ | ∇ ОБЛАСТЬ ← РАДИУС ОКРУЖЕНИЯ ОБЛАСТЬ ← PI × РАДИУС⋆2 ∇ | ∇ ОБЛАСТЬ ← ГРАДУСЫ СЕГМЕНТАЛЬНОГО РАДИУСА; ДРОБНАЯ ЧАСТЬ ; CA FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS AREA ← FRACTION × CA ∇ |
Отличаются ли функции с одним и тем же идентификатором, но разной степенью, определяется реализацией. Если разрешено, то функция CURVEAREA может быть определена дважды, чтобы заменить как монадическую CIRCLEAREA, так и диадическую SEGMENTAREA, указанную выше, при этом монадическая или диадическая функция выбирается контекстом, в котором на нее ссылаются.
Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, т.е. массивы должны либо иметь одинаковое количество элементов, либо один из них должен иметь один расширенный элемент. Из этого правила есть исключения: например, функция преобразования недесятичной валюты Великобритании в доллары должна будет принимать параметр с ровно тремя элементами, представляющими фунты, шиллинги и пенсы.
Внутри программы или пользовательской функции, управление может быть условно передано оператору, обозначенному номером строки или явной меткой; если целью является 0 (ноль), это завершает программу или возвращается к вызывающей функции. Наиболее распространенная форма использует функцию сжатия APL, как в шаблоне (условие) / цель, который имеет эффект оценки условия до 0 (ложь) или 1 (истина), а затем использования этого для маскирования цели (если условие false игнорируется, если true, остается в покое, поэтому управление передается).
Следовательно, функция SEGMENTAREA может быть изменена на прерывание (чуть ниже), возвращая ноль, если параметры (DEGREES и RADIUS ниже) имеют другой знак:
∇ AREA ← DEGREES SEGMENTAREA RADIUS; ДРОБНАЯ ЧАСТЬ ; CA; SIGN ⍝ локальные переменные, обозначенные точкой с запятой (;) FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS ⍝ этот оператор кода APL вызывает пользовательскую функцию CIRCLEAREA, определенную выше. ЗНАК ← (× ГРАДУСЫ) ≠ × РАДИУС ⍝ << APL logic TEST/determine whether DEGREES and RADIUS do NOT (≠ used) have same SIGN 1-yes different(≠), 0-no(same sign) AREA←0 ⍝ default value of AREA set = zero →SIGN/0 ⍝ branching(here, exiting) occurs when SIGN=1 while SIGN=0 does NOT branch to 0. Branching to 0 exits function. AREA←FRACTION×CA ∇
Вышеупомянутая функция SEGMENTAREA работает должным образом, если параметры являются скалярами или одноэлементными массивами, но не, если они являются многоэлементными массивами, поскольку условие в конечном итоге основывается на одном элементе массива SIGN - с другой стороны, пользовательская функция может быть изменена для правильной обработки векторизованных аргументов. Работа иногда может быть непредсказуемой, поскольку APL определяет, что компьютеры с возможностями векторной обработки должны распараллеливать и могут переупорядочивать операции с массивами, насколько это возможно - таким образом, тестирует и отлаживаетпользовательские функции, особенно если они будут использоваться с векторной или даже матричные аргументы. Это влияет не только на явное применение настраиваемой функции к массивам, но и на ее использование в любом месте, где можно разумно использовать двоичную функцию, например, при создании таблицы результатов:
90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0
Более краткий, а иногда и лучший способ - сформулировать функцию - это избегать явной передачи управления, вместо этого использовать выражения, которые правильно оцениваются во всех или ожидаемых условиях. Иногда правильно допустить сбой функции, когда один или оба аргумента inputявляются неверными- именно для того, чтобы дать пользователю понять, что один или оба использованных аргумента были неверными. Следующее является более кратким, чем приведенная выше функция SEGMENTAREA. Приведенный ниже важный элемент правильнообрабатывает векторизованные аргументы:
∇ AREA ← DEGREES SEGMENTAREA RADIUS; ДРОБНАЯ ЧАСТЬ ; CA; SIGN FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS SIGN ← (× DEGREES) ≠ × RADIUS AREA ← FRACTION × CA × ~ SIGN ⍝ этот оператор 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 таким влиятельным комментаторам, как Эдсгер Дейкстра. И наоборот, идиомы APL могут быть интересными, образовательными и полезными - если они используются с полезными комментариями ⍝, например, включая источник, предполагаемое значение и функцию идиомы (й). Вот список идиом APL, список идиом IBM APL2 здесь и финская библиотека идиом APL здесь.
Имя (я) | Символ | Пример | Значение (примера) | Кодовая точка Unicode |
---|---|---|---|---|
Высокий минус | ¯ | ¯3 | Обозначает отрицательное число | U + 00AF ¯ |
Лампа, Комментарий | ⍝ | ⍝Это комментарий | Все справа от ⍝ обозначает комментарий | U + 235D ⍝ |
RightArrow, Branch, GoTo | → | → This_Label | → This_Label отправляет выполнение APL в This_Label: | U + 2192 → |
Assign, LeftArrow, Установить на | ← | B ← A | B ← A устанавливает значения и форму B для соответствия A | U + 2190 ← |
Большинство реализаций APL поддерживают ряд системных переменных и функций, которым обычно предшествуют ⎕ (quad)и / или ")"(hook= закрывающая скобка) символ. Особенно важна и широко применяется переменная ⎕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набор = вектор из 12 последовательных целых чисел. Исходное начало индекса ⎕IOзначение = 1. Таким образом, первая позиция в векторе X или X [1] = 1на вектор значений йоты {12 3 4 5...}. |
⎕IO ← 0 X [1] 2 X [0] 1 | Источник индекса ⎕IOтеперь изменен на 0. Таким образом, «первая позиция индекса» в векторе X изменяется с 1 на 0. Следовательно, X [1]затем ссылается или указывает на 2из {1 23 4 5...} и X [0 ]теперь ссылается на 1. |
⎕WA 41226371072 | Quad WAили ⎕WA, другую динамическую системную переменную, показывает, сколько рабочей области остается неиспользованной или 41,226 мегабайт или около 41 гигабайт неиспользованной дополнительной общей свободной рабочей области, доступной для рабочего пространства APL и программы для обработки. Если это число становится низким или приближается к нулю - компьютеру может потребоваться больше оперативной памяти (RAM), жесткого диска пространства или их комбинации для увеличения виртуального memory. |
) VARS X | ) VARSсистемная функция в APL, ) VARSпоказывает имена пользовательских переменных, существующие в текущей рабочей области. |
Существуют также системные функции, доступные пользователям для сохранения текущего рабочего пространства, например, ) SAVEи завершения среды APL, например, ) OFF- иногда называются командами ловушки или функциями к использованию ведущей правой круглой скобки или крючка. Существует некоторая стандартизация этих функций квадроцикла и крюка.
Unicode Basic Multilingual Plane включает символы APL в блоке Miscellaneous Technical, которые, таким образом, обычно точно отображаются из более крупного Unicode шрифты, установленные в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Таким образом, несмотря на точность, глифы могут показаться незнакомыми программистам APL или их трудно отличить друг от друга.
Некоторые шрифты Unicode были разработаны для правильного отображения APL: APLX Upright, APL385 Unicode и SimPL.
До Unicode интерпретаторы APL поставлялись со шрифтами, в которых символы APL отображались в менее часто используемые позиции в наборах символов ASCII, обычно в верхних 128 кодовых точках. Эти сопоставления (и их национальные варианты) иногда были уникальными для интерпретатора каждого поставщика APL, что делало отображение программ APL в Интернете, в текстовых файлах и руководствах - часто проблематичным.
Обратите внимание на кнопку включения / выключения APL - крайнюю правую верхнюю клавишу, чуть ниже. Также обратите внимание на то, что на клавиатуре было около 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 для визуального изображения треугольника Паскаля:
Паскаль ← {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) Простые числа ← (2 = + ⌿0 = (⍳N) ∘. | ⍳N) / ⍳N ⍝ Однострочные простые числа Кена Айверсона 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 ⍴Простые числа 100 25 ⍝ Есть двадцать пять простых чисел в диапазоне до 100.
Часто требуется изучение обратного или противоположного математического решения (целочисленные множители числа ): докажите для подмножества целых чисел от 1 до 15, что они непростые, если перечислить их коэффициенты разложения. Каковы их множители, отличные от единицы (# делится на, кроме 1)?
⎕CR 'ProveNonPrime' Z ← ProveNonPrime R ⍝Показать все делители целого числа R, кроме 1 и самого числа, ⍝ т.е. доказать непростое число. Строка 'prime' возвращается для простого целого числа. Z ← (0 = (⍳R) | R) / ⍳R ⍝ Определить все множители для целого числа R, сохранить в ZZ ← (~ (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 'Fib onacci '⍝ Функция отображения Fibonacci FibonacciNum ← Fibonacci Nth; IOwas ⍝ Заголовок функции, имя функции = Fibonacci, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число. ⍝Создайте порядковое число Фибоначчи, где N-ый - номер позиции числа Фибоначчи в последовательности. << function description IOwas←⎕IO ⋄ ⎕IO←0 ⋄ FibonacciNum←↑0 1↓↑+.×/Nth/⊂2 2⍴1 1 1 0 ⋄ ⎕IO←IOwas ⍝ In order for this function to work correctly ⎕IO must be set to zero. Fibonacci¨⍳14 ⍝ This APL statement says: Generate the Fibonacci sequence over each(¨) integer number(iota or ⍳) for the integers 1..14. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Generated sequence, i.e., the Fibonacci sequence of numbers generated by APL's interpreter.