Синтаксис и символы APL
![]() | Эту статью может потребовать очистки Википедии , чтобы она соответствовала стандартам качества . Конкретная проблема: эта статья имеет нестандартную компоновку и форматирование. ( Октябрь 2015 г. ) |
Язык программирования APL отличается тем, что является скорее символическим , чем лексическим : его примитивы обозначаются символами , а не словами. Эти символы изначально были разработаны как математическое обозначение для описания алгоритмов. [1] Программисты APL часто присваивают неофициальные имена при обсуждении функций и операторов (например, «продукт» для ×/), но основные функции и операторы, предоставляемые языком, обозначаются нетекстовыми символами.
Монадические и диадические функции [ править ]
Большинство символов обозначают функции или операторы . Монадическая . функция принимает в качестве аргумента результат вычисления всего, что находится справа от нее (Управляется обычным способом с помощью круглых скобок.) Диадическая функция имеет еще один аргумент — первый элемент данных слева от нее. Многие символы обозначают как монадические, так и диадические функции, интерпретируемые в зависимости от использования. Например, ⌊3.2 дает 3, наибольшее целое число, не превышающее аргумент, а 3⌊2 дает 2, меньший из двух аргументов.
Функции и операторы [ править ]
APL использует термин «оператор» в смысле Хевисайда как модератор функции, в отличие от того, как некоторые другие языки программирования используют тот же термин в качестве чего-то, что работает с данными, см. реляционный оператор и операторы вообще . Другие языки программирования также иногда используют этот термин как синоним функции , однако в APL оба термина используются более точно. [2] [3] [4] [5] [6] Ранние определения символов APL были очень конкретными в отношении их классификации. [7] Например, оператор сокращения обозначается косой чертой и уменьшает массив по одной оси, вставив свой функциональный операнд . Пример сокращения :
×/2 3 4 24 |
<< Эквивалентные результаты в APL >> << сокращения Оператор / используется слева |
2×3×4 24 |
В приведенном выше случае уменьшения или косой черты оператор модерирует функцию умножения . Выражение ×/2 3 4 дает скалярный результат (только 1 элемент) путем сокращения массива путем умножения. Приведенный выше случай упрощен: представьте, что вы умножаете (складываете, вычитаете или делите) больше, чем просто несколько чисел вместе. (Из вектора ×/ возвращает произведение всех его элементов.)
1 0 1\45 67 45 0 67 |
<< Противоположные результаты в APL >> << Развернуть двоичную функцию \ используется слева Реплицировать диадическую функцию / используется справа >> |
1 0 1/45 0 67 45 67 |
Приведенные выше примеры диадических функций [примеры слева и справа] (с использованием одного и того же символа / , пример справа) демонстрируют, как логические значения (0 и 1) могут использоваться в качестве левых аргументов для \expand и /reреплицировать функций для получения совершенно противоположных результатов. С левой стороны двухэлементный вектор {45 67} расширяется там, где встречаются логические 0, что приводит к трехэлементному вектору {45 0 67} — обратите внимание, как APL вставил 0 в вектор. И наоборот, с правой стороны происходит прямо противоположное — где трехэлементный вектор становится всего лишь двухэлементным; логические 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
|
<< Во-первых, здесь нет круглых скобок и Шаг 2) 3 раза -1 = -3. |
Оператор может иметь функцию или операнды данных и возвращать двоичную или монадическую функцию. Операторы давно вышли за рамки. Оператор принимает в качестве левого операнда самую длинную функцию слева от него. Например:
∘.=/⍳¨3 3 1 0 0 0 1 0 0 0 1 |
APL Атомный или частичный субанализ ( полное объяснение ): Диэрезис ¨ или мини-двойная точка означает повторение или над каждым , или выполнение каждого отдельно, так что йота повторяется (в человеческом смысле, то есть в перевернутом виде, интерпретатор APL читает 3 3 при каждом использовании йоты), кратко: йота для каждой 3 . |
Левый операнд для каждого оператора ¨
это индексная функция. функция Производная ⍳¨
используется монадически и принимает в качестве правого операнда вектор 3 3
. Левая область каждого завершается оператором сокращения , обозначаемым косой чертой . Его левый операнд — это функциональное выражение слева от него: внешний продукт функции равенства . Результатом ∘.=/ является монадическая функция. При обычной длинной правой области видимости функции она принимает в качестве правого аргумента результат ⍳¨3 3. Таким образом
(⍳3)(⍳3)
1 2 3 1 2 3
(⍳3)∘.=⍳3
1 0 0
0 1 0
0 0 1
⍳¨3 3
1 2 3 1 2 3
∘.=/⍳¨3 3
1 0 0
0 1 0
0 0 1
|
Матрица единиц и нулей, полученная аналогичным образом Матрицы тождества полезны при решении определителей матриц , групп линейных уравнений и множественной регрессии . |
im ← ∘.=⍨∘⍳
im 3
1 0 0
0 1 0
0 0 1
|
Некоторые интерпретаторы APL поддерживают оператор составления ∘ и оператор коммутации ⍨ . Первый вариант ∘ объединяет функции, так что foo∘bar , например, может быть гипотетической функцией, которая применяет определенную функцию foo к результату определенной функции bar ; foo и bar могут представлять любую существующую функцию. В тех случаях, когда диадическая функция модерируется коммутацией , а затем используется монадически, ее правый аргумент также принимается в качестве левого аргумента. Таким образом, производная или составленная функция (с именем im слева) используется в сеансе пользователя APL для возврата 9- элементной идентификационной матрицы, используя ее правый аргумент , параметр или операнд = 3. |
Letters←"ABCDE"
Letters
ABCDE
⍴Letters
5
FindIt←"CABS"
FindIt
CABS
⍴FindIt
4
Letters ⍳ FindIt
3 1 2 6
|
Пример использования APL для индексации ⍳ или поиска (или не поиска) элементов в векторе символов : Сначала переменной Letters присваивается вектор из 5-ти элементов, в данном случае — букв алфавита. Форма ⍴ или длина вектора символов букв равна 5. Переменной FindIt назначается то, что искать в Letters , ее длина составляет 4 символа. 1 2 3 4 5 << позиции вектора или индексные номера в буквах Слева диадная функция iota ищет через свой левый аргумент (буквы) строку поиска (правый аргумент iota, FindIt). Йота находит букву «С» на позиции 3 в «Буквы», находит «А» на позиции 1 и «Б» на позиции 2. Йота не находит букву «S» в любом месте переменной Letters, поэтому возвращается число 6, которое на 1 больше длины Letters. Йота нашла буквы «КАБИ» (3 1 2). Йота правильно не нашла "S" (6). |
Монадические функции [ править ]
Имя(а) | Обозначения | Значение | Кодовая точка Юникода |
---|---|---|---|
Рулон | ?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 + ЗНАК ПЛЮС |
Знак | ×B
|
¯1, если B <0; 0, если В =0; 1, если B >0 | U + 00D7 × ЗНАК УМНОЖЕНИЯ |
Взаимный | ÷B
|
1 разделить на Б | U+00F7 ÷ ЗНАК РАЗДЕЛЕНИЯ |
Равель, Катенат, Ламинат | ,B
|
Преобразует B в вектор | U+002C , ЗАПЯТАЯ |
Обратная матрица , монадическое деление на квадрики | ⌹B
|
Обратная матрица B | U + 2339 ⌹ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL QUAD DIVIDE |
Пи времена | ○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 ВНИЗ. |
Монадический формат | ⍕B
|
Представление персонажа B | U + 2355 ⍕ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL UP TACK JOT |
Монадическое транспонирование | ⍉B
|
Поменяйте местами оси B. | U + 2349 ⍉ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL, обратная косая черта в круге |
Факториал | !B
|
Произведение целых чисел от 1 до B | У+0021 ! ВОСКЛИЦАТЕЛЬНЫЙ ЗНАК |
Глубина | ≡B
|
Глубина вложенности: 1 для невложенного массива. | U + 2261 ≡ ИДЕНТИЧЕН |
Стол | ⍪B
|
Превращает B в таблицу, двумерный массив. | U + 236A ⍪ ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ЗАПЯТАЯ |
Диадические функции [ править ]
Имя(а) | Обозначения | Значение | Юникод кодовая точка |
---|---|---|---|
Добавлять | A+B
|
Сумма А и Б | U + 002B + ЗНАК ПЛЮС |
Вычесть | A−B
|
А минус Б | U + 2212 — ЗНАК МИНУС |
Умножить | A×B
|
А, умноженное на Б | U + 00D7 × ЗНАК УМНОЖЕНИЯ |
Разделять | 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 ? ЗНАК ВОПРОСА |
Членство, Эпсилон | A∈B
|
1 для элементов A, присутствующих в B ; 0 где нет. | U+2208 ∈ ЭЛЕМЕНТ |
Найди, Эпсилон Чудесный | 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
|
Б форма А | 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 QUAD DIVIDE |
Вращение | 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 за раз | У+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. Alt: 1 (Истина), если A или B = 1 (Истина). | U + 2228 ∨ ЛОГИЧЕСКОЕ ИЛИ |
И | A∧B
|
Булева логика: 1 (истина), если оба A и B = 1 , 0 (ложь) в противном случае. | U+2227 ∧ ЛОГИЧЕСКОЕ И |
Ни | A⍱B
|
Булева логика: 1, если оба A и B равны 0, в противном случае 0. Alt: ~∨ = not Или | 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 ЗАПЯТАЯ |
Операторы и индикатор оси [ править ]
Имя(а) | Символ | Пример | Значение (пример) | Последовательность кодовых точек Юникода |
---|---|---|---|---|
Уменьшить (последняя ось), Слэш | / | +/B
|
Сумма по B | U + 002F / СОЛИДУС |
Уменьшить (первая ось) | ⌿ | +⌿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 . ПОЛНАЯ СТОП |
Примечания. Операторы сокращения и сканирования ожидают двоичную функцию слева, образуя монадическую составную функцию, применяемую к вектору справа.
Оператор продукта "." ожидает двоичную функцию как слева, так и справа, образуя двоичную составную функцию, применяемую к векторам слева и справа. Если функция слева от точки равна «∘» (означает ноль), то составная функция является внешним продуктом, в противном случае — внутренним продуктом. Внутренний продукт, предназначенный для обычного умножения матриц, использует функции + и ×, замена их другими двоичными функциями может привести к полезным альтернативным операциям.
За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т. е. он появляется между функцией и массивом, и его не следует путать с индексами массива, написанными после массива. Например, учитывая функцию ⌽ (разворот) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:
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. Эти типы преобразований данных полезны при анализе временных рядов и пространственных координат , всего два примера, существуют еще . |
В частном случае, если за диадической катенатной функцией «,» следует индикатор оси (или модификатор оси символа/функции), ее можно использовать для ламинирования (вставки) двух массивов в зависимости от того, меньше ли индикатор оси или больше, чем начало индекса [8] (начало индекса = 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 или в кубе во времени и т. д.). Массивы, содержащие как символы, так и числа, называются смешанными массивами . [9] Структуры массивов, содержащие элементы, которые также являются массивами, называются вложенными массивами . [10]
Управление потоком [ править ]
Пользователь а может определять собственные функции , которые, как и переменные, идентифицируются по имени, не по нетекстовому символу. Заголовок функции определяет, является ли пользовательская функция ниладической (без аргументов), монадической (один правый аргумент) или диадной (левый и правый аргументы), локальное имя результата ( слева от стрелки назначения ← ), а также то, является ли она имеет какие-либо локальные переменные (каждая разделена точкой с запятой ';').
Ниладическая функция PI или π(pi) | Монадическая функция CIRCLEAREA | Диадическая функция SEGMENTAREA с локальными переменными |
---|---|---|
∇ RESULT←PI
RESULT←○1
∇
|
∇ AREA←CIRCLEAREA RADIUS
AREA←PI×RADIUS⋆2
∇
|
∇ AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA
FRACTION←DEGREES÷360
CA←CIRCLEAREA RADIUS
AREA←FRACTION×CA
∇
|
Различаются ли функции с одинаковым идентификатором, но разной сложностью , зависит от реализации. Если это разрешено, то функцию CURVEAREA можно определить дважды, чтобы заменить как монадическую CIRCLEAREA, так и диадическую SEGMENTAREA выше, при этом монадическая или диадическая функция выбирается в зависимости от контекста, в котором на нее ссылаются.
Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, т. е. массивы должны либо иметь одинаковое количество элементов, либо один из них должен иметь один расширенный элемент. Есть исключения из этого правила: например, функция преобразования недесятичной валюты Великобритании в доллары должна принимать параметр, состоящий ровно из трех элементов, представляющих фунты, шиллинги и пенсы. [11]
Внутри программы или пользовательской функции управление может быть условно передано оператору, определяемому номером строки или явной меткой; если целью является 0 (ноль), это завершает программу или возвращает вызывающую функцию. В наиболее распространенной форме используется функция сжатия APL, например, в шаблоне (условии)/цели, результатом которой является оценка условия до 0 (ложь) или 1 (истина), а затем использование ее для маскировки цели (если условие равно false игнорируется, если true, то остается в покое, поэтому управление передается).
Следовательно, функцию SEGMENTAREA можно изменить для прерывания (чуть ниже), возвращая ноль, если параметры (DEGREES и RADIUS ниже) имеют разные знаки:
∇ AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN ⍝ local variables denoted by semicolon(;)
FRACTION←DEGREES÷360
CA←CIRCLEAREA RADIUS ⍝ this APL code statement calls user function CIRCLEAREA, defined up above.
SIGN←(×DEGREES)≠×RADIUS ⍝ << 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
Более краткий, а иногда и лучший способ — сформулировать функцию — избегать явной передачи управления, вместо этого использовать выражения, которые правильно вычисляются во всех или ожидаемых условиях. Иногда правильно допустить сбой функции, когда один или оба входных аргумента неверны - именно для того, чтобы пользователь знал, что один или оба использованных аргумента неверны. Следующая функция более кратка, чем приведенная выше функция SEGMENTAREA. Ниже важно правильно обрабатывать векторизованные аргументы:
∇ AREA←DEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN
FRACTION←DEGREES÷360
CA←CIRCLEAREA RADIUS
SIGN←(×DEGREES)≠×RADIUS
AREA←FRACTION×CA×~SIGN ⍝ this APL statement is more complex, as a one-liner - but it solves vectorized arguments: a tradeoff - complexity vs. branching
∇
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 здесь .
Разное [ править ]
Имя(а) | Символ | Пример | Значение (пример) | Кодовая точка Юникода |
---|---|---|---|---|
Высокий минус [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 поддерживают ряд системных переменных и функций, которым обычно предшествует символ ⎕ (квадратный) и/или «)» ( крючок = закрывающая скобка). Обратите внимание, что четырехзначный символ — это не то же самое, что символ пропущенного символа Юникода . Особенно важной и широко применяемой является переменная ⎕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 последовательных целых чисел. Начальное происхождение индекса ⎕IO value = 1 . Таким образом, первая позиция в векторе X или X[1] = 1 на вектор значений йоты { 1 2 3 4 5 ...}. |
⎕IO←0
X[1]
2
X[0]
1
|
Индекс Origin ⎕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 и программы для обработки. Если это число становится низким или приближается к нулю, компьютеру может потребоваться больше оперативной памяти (ОЗУ), места на жестком диске или некоторая комбинация того и другого для увеличения виртуальной памяти . |
)VARS
X
|
)VARS — системная функция в APL, [15] )VARS показывает имена пользовательских переменных, существующие в текущей рабочей области. |
Пользователям также доступны системные функции для сохранения текущего рабочего пространства, например, )SAVE и завершения среды APL, например, )OFF - иногда называемые командами или функциями- перехватчиками из-за использования ведущей правой скобки или перехватчика. [16] Существует некоторая стандартизация этих функций Quad и Hook.
Шрифты [ править ]
Unicode Базовая многоязычная плоскость включает символы APL в блок «Разное техническое» , [17] которые, таким образом, обычно точно отображаются из более крупных шрифтов Unicode, установленных в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Таким образом, несмотря на то, что глифы точны, они могут показаться программистам APL незнакомыми или их будет трудно отличить друг от друга.
Некоторые шрифты Unicode были разработаны для хорошего отображения APL: APLX Upright, APL385 Unicode и SimPL.
До появления Unicode интерпретаторы APL поставлялись со шрифтами, в которых символы APL отображались в менее часто используемые позиции в наборах символов ASCII, обычно в верхних 128 кодовых точках. Эти сопоставления (и их национальные варианты) иногда были уникальными для интерпретатора каждого поставщика APL, что делало отображение программ APL в Интернете, в текстовых файлах и руководствах часто проблематичным.
Функция клавиатуры APL2 для сопоставления символов [ править ]

Обратите внимание на кнопку включения/выключения 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 для визуального изображения треугольника Паскаля:
Pascal←{0~¨⍨a⌽⊃⌽∊¨0,¨¨a∘!¨a←⌽⍳⍵} ⍝ Create one-line user function called Pascal
Pascal 7 ⍝ Run function Pascal for seven rows and show the results below:
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' ⍝ Show APL user-function PrimeNumbers
Primes←PrimeNumbers N ⍝ Function takes one right arg N (e.g., show prime numbers for 1 ... int N)
Primes←(2=+⌿0=(⍳N)∘.|⍳N)/⍳N ⍝ The Ken Iverson one-liner
PrimeNumbers 100 ⍝ Show all prime numbers from 1 to 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 ⍝ There are twenty-five prime numbers in the range up to 100.
Часто необходимо исследовать обратное или противоположное математическому решению ( целочисленные множители числа ): Докажите для подмножества целых чисел от 1 до 15, что они непростые, перечислив их коэффициенты разложения . Каковы их неединичные делители (число делится на, кроме 1)?
⎕CR 'ProveNonPrime'
Z←ProveNonPrime R
⍝Show all factors of an integer R - except 1 and the number itself,
⍝ i.e., prove Non-Prime. String 'prime' is returned for a Prime integer.
Z←(0=(⍳R)|R)/⍳R ⍝ Determine all factors for integer R, store into Z
Z←(~(Z∊1,R))/Z ⍝ Delete 1 and the number as factors for the number from Z.
→(0=⍴Z)/ProveNonPrimeIsPrime ⍝ If result has zero shape, it has no other factors and is therefore prime
Z←R,(⊂" factors(except 1) "),(⊂Z),⎕TCNL ⍝ Show the number R, its factors(except 1,itself), and a new line char
→0 ⍝ Done with function if non-prime
ProveNonPrimeIsPrime: Z←R,(⊂" prime"),⎕TCNL ⍝ function branches here if number was prime
ProveNonPrime ¨⍳15 ⍝ Prove non primes for each(¨) of the integers from 1 through 15 (iota 15)
1 prime
2 prime
3 prime
4 factors(except 1) 2
5 prime
6 factors(except 1) 2 3
7 prime
8 factors(except 1) 2 4
9 factors(except 1) 3
10 factors(except 1) 2 5
11 prime
12 factors(except 1) 2 3 4 6
13 prime
14 factors(except 1) 2 7
15 factors(except 1) 3 5
Последовательность Фибоначчи [ править ]
Создайте последовательность чисел Фибоначчи , где каждое последующее число в последовательности представляет собой сумму двух предыдущих:
⎕CR 'Fibonacci' ⍝ Display function Fibonacci
FibonacciNum←Fibonacci Nth;IOwas ⍝ Funct header, funct name=Fibonacci, monadic funct with 1 right hand arg Nth;local var IOwas, and a returned num.
⍝Generate a Fibonacci sequenced number where Nth is the position # of the Fibonacci number in the sequence. << 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.
Дальнейшее чтение [ править ]
- Поливка, Раймонд П.; Пакин, Сандра (1975). APL: язык и его использование . Прентис-Холл. ISBN 978-0-13-038885-8 .
- Рейтер, Клиффорд А.; Джонс, Уильям Р. (1990). APL с математическим акцентом (1-е изд.). Тейлор и Фрэнсис. ISBN 978-0534128647 .
- Томпсон, Норман Д.; Поливка, Раймонд П. (2013). APL2 в глубине (Серия Springer по статистике) (Мягкая обложка) (Перепечатка оригинального 1-го изд.). Спрингер. ISBN 978-0387942131 .
- Гилман, Леонард; Роуз, Аллен Дж. (1976). APL: Интерактивный подход (Мягкая обложка) (3-е изд.). Уайли. ISBN 978-0471093046 .
См. также [ править ]
- Разное техническое — блок Unicode, включая ключи APL.
- APL (кодовая страница) § Раскладка клавиатуры — более современная информация о раскладке клавиатуры APL.
Ссылки [ править ]
- ^ Айверсон, Кеннет Э. (1 января 1962 г.). «Язык программирования». Материалы весенней совместной компьютерной конференции AIEE-IRE '62 (весна), состоявшейся 1–3 мая 1962 г. Нью-Йорк, штат Нью-Йорк, США: ACM. стр. 345–351. дои : 10.1145/1460833.1460872 . S2CID 11777029 .
- ^ Баронет, Дэн. «Крутые операторы APL» . archive.vector.org.uk . Фото со стока - Журнал Британской ассоциации APL . Проверено 13 января 2015 г.
- ^ МикроАПЛ. «Примитивные операторы» . www.microapl.co.uk . МикроАПЛ . Проверено 13 января 2015 г.
- ^ МикроАПЛ. «Операторы» . www.microapl.co.uk . МикроАПЛ . Проверено 13 января 2015 г.
- ^ Прогопедия. «АПЛ» . progopedia.com . Прогопедия . Проверено 13 января 2015 г.
- ^ Диалог. «D-функции и операторы, свободно сгруппированные по категориям» . dfns.dyalog.com . Диалог . Проверено 13 января 2015 г.
- ^ ИБМ. «Справочное руководство IBM 5100 APL» (PDF) . bitsavers.trailing-edge.com . ИБМ. Архивировано из оригинала (PDF) 14 января 2015 года . Проверено 14 января 2015 г.
- ^ Браун, Джим (1978). «В защиту происхождения индекса 0» . ACM SIGAPL APL Quote Quad . 9 (2): 7. дои : 10.1145/586050.586053 . S2CID 40187000 .
- ^ МикроАПЛ. «Руководство по языку APLX» (PDF) . www.microapl.co.uk . MicroAPL — версия 5.0, июнь 2009 г. с. 22 . Проверено 31 января 2015 г.
- ^ Бенкард, Дж. Филип (1992). «Вложенные массивы и операторы: некоторые глубокие вопросы». Материалы международной конференции по APL-APL'92 . Том. 23. стр. 7–21. дои : 10.1145/144045.144065 . ISBN 978-0897914772 . S2CID 7760410 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - ^ Берри, Пол «APL \ 360 Учебный текст для студентов» , IBM Research, Исследовательский центр Томаса Дж. Уотсона, 1969.
- ^ «Трактат» (PDF) . www.cs.utexas.edu . Проверено 10 сентября 2019 г.
- ^ Кейсон, Стэн (13 мая 2006 г.). «Библиотека идиом APL2» . www-01.ibm.com . ИБМ . Проверено 1 февраля 2015 г.
- ^ «Высокий минус» APL применяется к следующему за ним единственному числу, а монадическая функция минус меняет знак всего массива справа от него.
- ^ «Рабочая область — Системные функции» . Microapl.co.uk. п. (внизу веб-страницы) . Проверено 5 ноября 2018 г.
- ^ «Справочник по языку APL» (PDF) . Проверено 5 ноября 2018 г.
- ^ Диаграмма Юникод «Разное техническое (включая 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 от Юргена Зауэрмана Бесплатный загружаемый интерпретатор
- Учебники по APL на YouTube , загруженные Чимином Паком, 8 вводных/обучающих видеороликов для начинающих.
- Список руководств, составленный SIGAPL
- Изучите APL: Учебное пособие по APL от MicroAPL
Синтаксические правила [ править ]
- Игра жизни Конвея в APL, на YouTube
- Айверсон, Кеннет Э. (1983). «Синтаксис и семантика APL». Материалы международной конференции по APL-APL'83 . Том. 13. С. 223–231. дои : 10.1145/800062.801221 . ISBN 978-0897910958 . S2CID 16511283 .
{{cite book}}
:|journal=
игнорируется ( помогите ) - Гффер, М. (1989). «Будущее APL: примеры и проблемы». Материалы конференции APL как инструмент мышления — APL '89 . Том. 19. стр. 158–163. дои : 10.1145/75144.75166 . ISBN 978-0897913270 . S2CID 6011221 .
{{cite book}}
:|journal=
игнорируется ( помогите )