Эта статья может потребовать очистки для соответствия стандартам качества Википедии . Конкретная проблема: эта статья имеет нестандартную компоновку и форматирование. ( Октябрь 2015 ) |
Язык программирования 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 ):
1 ÷ 2 ⌊ 3 × 4 - 5 ¯0,3333333333 1 ÷ 2 ⌊ 3 × ¯1 ¯0,3333333333 1 ÷ 2 ⌊ ¯3 ¯0,3333333333 1 ÷ ¯3 ¯0,3333333333 | << Во-первых, обратите внимание, что скобок нет, и Шаг 2) 3 раза -1 = -3. |
Оператор может иметь функциональные или данные операнды и вычислять диадическую или монадическую функцию. Операторы имеют длинную левую область видимости. Оператор принимает в качестве своего левого операнда самую длинную функцию слева от себя. Например:
∘.=/⍳¨3 3 1 0 0 0 1 0 0 0 1 | Атомарный или поэлементный субанализ APL ( полное объяснение ): Трема или мини-двойная точка означает повторить или над каждым или выполнить каждое по отдельности, поэтому йота повторяется (в человеческом языке , т. е. в обратных терминах, интерпретатор APL читает 3 3 над каждым, используя йоту), кратко: йота для каждой 3 . |
Левый операнд для оператора over-each¨
— это функция index ⍳ . Производная функция ⍳¨
используется монадически и принимает в качестве своего правого операнда вектор 3 3
. Левая область действия each завершается оператором reduce , обозначенным прямой косой чертой . Ее левый операнд — это функциональное выражение слева: внешнее произведение функции equals . Результат ∘.=/ — монадическая функция. С обычной длинной правой областью действия функции она принимает в качестве своего правого аргумента результат ⍳¨3 3. Таким образом,
(⍳3)(⍳3)1 2 3 1 2 3 (⍳3)∘.=⍳31 0 00 1 00 0 1 ⍳¨3 31 2 3 1 2 3 ∘.=/⍳¨3 3 1 0 0 0 1 0 0 0 1 |
Матрица из единиц и нулей, полученная аналогичным образом с помощью Единичные матрицы полезны при решении определителей матриц , групп линейных уравнений и множественной регрессии . |
я ← ∘. = ⍨∘ ⍳ я 3 1 0 0 0 1 0 0 0 1 | Некоторые интерпретаторы APL поддерживают оператор compose ∘ и оператор commute ⍨ . Первый ∘ склеивает функции вместе, так что foo∘bar , например, может быть гипотетической функцией, которая применяет определенную функцию foo к результату определенной функции bar ; foo и bar могут представлять любую существующую функцию. В случаях, когда диадическая функция модерируется commute и затем используется монадически, ее правый аргумент также принимается в качестве ее левого аргумента. Таким образом, производная или составная функция (названная im слева) используется в сеансе пользователя APL для возврата 9- элементной матрицы идентичности с использованием ее правого аргумента , параметра или операнда = 3. |
Буквы ← "ABCDE" Буквы ABCDE ⍴ Буквы 5 FindIt ← "CABS" FindIt CABS ⍴ FindIt 4 Буквы ⍳ FindIt 3 1 2 6 | Пример использования APL для индексации ⍳ или поиска (или не поиска) элементов в символьном векторе : Сначала переменной Letters присваивается вектор из 5-ти элементов, в данном случае - букв алфавита. Длина вектора символов ⍴ или Letters равна 5. Переменной FindIt назначается то, что нужно искать в Letters , и ее длина составляет 4 символа. 1 2 3 4 5 << позиции векторов или индексы # в буквах Слева диадическая функция iota выполняет поиск по своему левому аргументу (Letters) для строки поиска (правый аргумент iota, FindIt). Iota находит букву «C» на позиции 3 в Letters, находит «A» на позиции 1 и «B» на позиции 2. Iota не находит букву «S» в любом месте переменной Letters, поэтому возвращается число 6, которое на 1 больше длины Letters. Iota нашла буквы "CAB" (3 1 2). Йота правильно не нашла "S" (6). |
Имя(я) | Обозначение | Значение | Кодовая точка Unicode |
---|---|---|---|
Рулон | ?B | Одно целое число, выбранное случайным образом из первых B целых чисел | U+003F ? ВОПРОСИТЕЛЬНЫЙ ЗНАК |
Потолок | ⌈B | Наименьшее целое число, большее или равное B | U+2308 ⌈ ЛЕВЫЙ ПОТОЛОК |
Пол | ⌊B | Наибольшее целое число, меньшее или равное B | U+230A ⌊ ЛЕВЫЙ ЭТАЖ |
Форма, Ро | ⍴B | Количество компонентов в каждом измерении B | U+2374 ⍴ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL RHO |
Нет , Тильда | ∼B | Логический: ∼1 равно 0, ∼0 равно 1 | U+223C ∼ ОПЕРАТОР ТИЛЬДА |
Абсолютное значение | ∣B | Величина B | U+2223 ∣ ДЕЛИТ |
Генератор индекса, Йота | ⍳B | Вектор первых B целых чисел | U+2373 ⍳ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ IOTA |
Экспоненциальный | ⋆B | е в степени B | U+22C6 ⋆ ЗВЕЗДНЫЙ ОПЕРАТОР |
Отрицание | −B | Изменяет знак B | U+2212 − ЗНАК МИНУС |
Сопряженный | +B | Комплексное сопряжение B (действительные числа возвращаются без изменений) | U+002B + ЗНАК ПЛЮС |
Signum | ×B | ¯1, если В < 0; 0, если В = 0; 1, если В > 0 | U+00D7 × ЗНАК УМНОЖЕНИЯ |
Взаимный | ÷B | 1 делится на B | U+00F7 ÷ ЗНАК ДЕЛЕНИЯ |
Расщепление, Склеивание, Ламинат | ,B | Преобразует B в вектор | U+002C , ЗАПЯТАЯ |
Обратная матрица , Монадическое четверное деление | ⌹B | Обратная матрица B | U+2339 ⌹ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЧЕТЫРЕХМЕРНОЕ ДЕЛЕНИЕ |
Пи умножить на | ○B | Умножить на π | U+25CB ○ БЕЛЫЙ КРУГ |
Логарифм | ⍟B | Натуральный логарифм B | U+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 | Выполнить выражение APL | U+234E ⍎ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ DOWN TACK JOT |
Монадический формат | ⍕B | Характерное представление B | U+2355 ⍕ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ UP TACK JOT |
Монадическая транспонировка | ⍉B | Поменять местами оси B | U+2349 ⍉ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КРУГ ОБРАТНАЯ КОСАЯ ЧЕРТА |
Факториал | !B | Произведение целых чисел от 1 до B | U+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 , выбранные AA =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 | A отдельных целых чисел, выбранных случайным образом из первых B целых чисел | U+003F ? ВОПРОСИТЕЛЬНЫЙ ЗНАК |
Членство, Эпсилон | A∈B | 1 для элементов A, присутствующих в B ; 0, если их нет. | U+2208 ∈ ЭЛЕМЕНТ |
Найти, Эпсилон Underbar | A⍷B | 1 для начальной точки многоэлементного массива A, присутствующего в B ; 0 — где нет. | U+2377 ⍷ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ЭПСИЛОН ПОДЧЕРКНУТЫЙ |
Максимум , Потолок | A⌈B | Большее значение A или B | U+2308 ⌈ ЛЕВЫЙ ПОТОЛОК |
Минимум , Пол | A⌊B | Меньшее значение A или B | U+230A ⌊ ЛЕВЫЙ ЭТАЖ |
Изменение формы, Диадический Ро | A⍴B | Массив формы A с данными B | U+2374 ⍴ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL RHO |
Брать | A↑B | Выберите первый (или последний) элемент A из B в соответствии с × A | U+2191 ↑ СТРЕЛКА ВВЕРХ |
Уронить | A↓B | Удалить первый (или последний) элемент A из B в соответствии с × A | U+2193 ↓ СТРЕЛКА ВНИЗ |
Расшифровать | A⊥B | Значение многочлена, коэффициенты которого находятся в точке B и точке A | U+22A5 ⊥ ВВЕРХ |
Кодировать | A⊤B | База — представление значения B | U+22A4 ⊤ ВНИЗ |
Остаток | A∣B | B по модулю A | U+2223 ∣ ДЕЛИТ |
Катенация | A,B | Элементы B, добавленные к элементам A | U+002C , ЗАПЯТАЯ |
Расширение, Двойной обратный слэш | A\B | Вставьте нули (или пробелы) в B, соответствующие нулям в A. | U+005C \ ОБРАТНЫЙ СОЛИДУС |
Сжатие, Двойной слэш | A/B | Выберите элементы в B, соответствующие элементам в A. | U+002F / СОЛИДУС |
Индекс, Диадическая Йота | A⍳B | Местоположение (индекс) B в A ; если не найдено1+⍴A | U+2373 ⍳ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ IOTA |
Матричное деление, Диадическое четверное деление | A⌹B | Решение системы линейных уравнений , множественная регрессия A x = B | U+2339 ⌹ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЧЕТЫРЕХМЕРНОЕ ДЕЛЕНИЕ |
Вращение | A⌽B | Элементы B повернуты на позиции A | U+233D ⌽ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ СТИЛЬ |
Вращение | A⊖B | Элементы B повернуты на A позиций вдоль первой оси | U+2296 ⊖ МИНУС В КРУГЕ |
Логарифм | A⍟B | Логарифм B по основанию A | U+235F ⍟ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ КРУГ ЗВЕЗДА |
Диадический формат | A⍕B | Формат B в матрицу символов согласно A | U+2355 ⍕ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ UP TACK JOT |
Общая транспонировка | A⍉B | Оси B упорядочены по A | U+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≡B | 0, если A не соответствует B в точности по значению, форме и вложенности; в противном случае 1. | U+2261 ≡ ИДЕНТИЧНО |
Ламинат | A⍪B | Объединить вдоль первой оси | U+236A ⍪ APL ФУНКЦИОНАЛЬНЫЙ СИМВОЛ ЗАПЯТАЯ ШТРИХ |
Имя(я) | Символ | Пример | Значение (примера) | Последовательность кодовых точек Unicode |
---|---|---|---|---|
Уменьшить (последняя ось), Косая черта | / | +/B | Сумма по B | U+002F / СОЛИДУС |
Уменьшить (первая ось) | ⌿ | +⌿B | Сумма вниз B | U+233F ⌿ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КОСА |
Сканирование (последняя ось), обратная косая черта | \ | +\B | Текущая сумма по B | U+005C \ ОБРАТНЫЙ СОЛИДУС |
Сканирование (первая ось) | ⍀ | +⍀B | Текущая сумма вниз B | U+2340 ⍀ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ОБРАТНАЯ КОСАЯ ЧЕРТА |
Внутренний продукт | . | A+.×B | Матричное произведение A и B | U+002E . ТОЧКА |
Внешний продукт | ∘. | A∘.×B | Внешний продукт A и B | U+2218 ∘ ОПЕРАТОР КОЛЬЦА , U+002E . ТОЧКА |
Примечания: Операторы reduce и scan ожидают диадическую функцию слева, образуя монадическую составную функцию, примененную к вектору справа.
Оператор произведения "." ожидает диадическую функцию слева и справа, образуя диадическую составную функцию, примененную к векторам слева и справа. Если функция слева от точки - "∘" (обозначающая ноль), то составная функция является внешним произведением, в противном случае это внутреннее произведение. Внутреннее произведение, предназначенное для обычного умножения матриц, использует функции + и ×, замена их другими диадическими функциями может привести к полезным альтернативным операциям.
За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т. е. он появляется между функцией и массивом и его не следует путать с индексами массива, написанными после массива. Например, если задана функция ⌽ (реверс) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:
А ← 4 3 ⍴⍳ 12 А 1 2 3 4 5 6 7 8 9 10 11 12 ⌽ А 3 2 1 6 5 4 9 8 7 12 11 10 ⌽ [ 1 ] А 10 11 12 7 8 9 4 5 6 1 2 3 ⊖⌽ А 12 11 10 9 8 7 6 5 4 3 2 1 ⍉ А 1 4 7 10 2 5 8 11 3 6 9 12 |
Теперь A отражен или перевернут вдоль своей вертикальной оси, как визуально показывает символ ⌽ . A теперь отражается с помощью индикатора оси [1] или модификатора первого измерения . Результатом является то, что переменная A отражается по горизонтальной оси, а не по вертикали. A теперь отражается как по вертикали ⊖ , так и по горизонтали ⌽ . A ⍉ транспонируется в матрицу 3 строки на 4 столбца таким образом, что строки-столбцы меняются местами, как визуально изображает символ ⍉ . Сравните полученный результат с исходной матрицей, хранящейся в A, самой верхней матрице. Эти типы преобразований данных полезны в анализе временных рядов и пространственных координатах , всего два примера, есть и другие . |
В частном случае, если за функцией диадической катенаты "," следует индикатор оси (или модификатор оси для символа/функции), ее можно использовать для ламинирования (вставки) двух массивов в зависимости от того, меньше или больше индикатор оси, чем начало координат индекса [8] (начало координат индекса = 1 на иллюстрации ниже):
Б ← 1 2 3 4 В ← 5 6 7 8 Б , С 1 2 3 4 5 6 7 8 Б , [ 0,5 ] С 1 2 3 4 5 6 7 8 Б , [ 1,5 ] С 1 5 2 6 3 7 4 8 | Слева переменной 'B' сначала назначается вектор из 4 последовательных целых чисел (например, ⍳4 ). Затем |
Массивы — это структуры, элементы которых сгруппированы линейно как векторы или в табличной форме как матрицы — и более высокие измерения (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[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←A | B←A устанавливает значения и форму B для соответствия A | U+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 в Интернете, в текстовых файлах и руководствах - часто проблематичным.
Обратите внимание на клавишу 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.
{{cite book}}
: |journal=
проигнорировано ( помощь ){{cite book}}
: |journal=
проигнорировано ( помощь ){{cite book}}
: |journal=
проигнорировано ( помощь )