Синтаксис и символы 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. |
Буквы ← «ABCDE»
Буквы
ABCDE
⍴ Буквы
5
FindIt ← «CABS»
FindIt
CABS
⍴ FindIt
4
Буквы ⍳ 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: грех( B ) A =5: грех( B ) А =2: соз( В ) А =6: соз( В ) A =3: загар( B ) A =7: рыбный( 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
∇
|
∇ ПЛОЩАДЬ ← ГРАДУСЫ СЕГМЕНТАРНЫЙ РАДИУС ; ДОЛЯ ; CA
ДОЛЯ ← ГРАДУСЫ ÷ 360
CA ← КРУГЛАЯ РАДИУС
ПЛОЩАДЬ ← ДРОБЬ × CA
∇
|
Различаются ли функции с одинаковым идентификатором, но разной сложностью , зависит от реализации. Если это разрешено, то функцию CURVEAREA можно определить дважды, чтобы заменить как монадическую CIRCLEAREA, так и диадическую SEGMENTAREA выше, при этом монадическая или диадическая функция выбирается в зависимости от контекста, в котором на нее ссылаются.
Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, т. е. массивы должны либо иметь одинаковое количество элементов, либо один из них должен иметь один расширенный элемент. Есть исключения из этого правила: например, функция для преобразования недесятичной валюты Великобритании в доллары должна принимать параметр, состоящий ровно из трех элементов, представляющих фунты, шиллинги и пенсы. [11]
Внутри программы или пользовательской функции управление может быть условно передано оператору, определяемому номером строки или явной меткой; если целью является 0 (ноль), это завершает программу или возвращает вызывающую функцию. В наиболее распространенной форме используется функция сжатия APL, как в шаблоне (условии)/цели, результатом которой является оценка условия до 0 (ложь) или 1 (истина), а затем использование ее для маскировки цели (если условие равно false игнорируется, если true, то остается в покое, поэтому управление передается).
Следовательно, функцию SEGMENTAREA можно изменить для прерывания (чуть ниже), возвращая ноль, если параметры (DEGREES и RADIUS ниже) имеют разные знаки:
∇ ПЛОЩАДЬ ← ГРАДУСЫ СЕГМЕНТАРНЫЙ РАДИУС ; ДОЛЯ ; Калифорния ; SIGN ⍝ локальные переменные, обозначаемые точкой с запятой (;)
FRACTION ← DEGREES ÷ 360
CA ← CIRCLEEAREA RADIUS ⍝ этот оператор кода APL вызывает пользовательскую функцию CIRCLEAREA, определенную выше.
ЗНАК ← ( × ГРАДУСЫ ) ≠× РАДИУС ⍝ << Логика APL ТЕСТ/определение, НЕ имеют ли ГРАДУСЫ и РАДИУС (≠ используются) одинаковый ЗНАК 1-да, разные(≠), 0-нет (один и тот же знак)
ОБЛАСТЬ ← 0 ⍝ по умолчанию значение AREA установлено = ноль
→ SIGN / 0 ⍝ ветвление (здесь выход) происходит, когда SIGN=1, тогда как SIGN=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. Ниже важно правильно обрабатывать векторизованные аргументы:
∇ ПЛОЩАДЬ ← ГРАДУСЫ СЕГМЕНТАРНЫЙ РАДИУС ; ДОЛЯ ; Калифорния ; ЗНАК
ДРОБЬ ← ГРАДУСЫ ÷ 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 здесь .
Разное [ править ]
Имя(а) | Символ | Пример | Значение (пример) | Кодовая точка Юникода |
---|---|---|---|---|
Высокий минус [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 ←
X[1]
2
X[0]
0
|
Индекс 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 и программы для обработки. Если это число становится низким или приближается к нулю, компьютеру может потребоваться больше оперативной памяти (ОЗУ), места на жестком диске или некоторая комбинация того и другого для увеличения виртуальной памяти . |
) ВАРС
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 для сопоставления символов [ править ]
![Клавиатура APL2](http://upload.wikimedia.org/wikipedia/commons/6/6d/APL2-nappaimisto.png)
Обратите внимание на кнопку включения/выключения 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 ~ ¨⍨ а ⌽⊃⌽∊ ¨ 0 , ¨¨ а ∘ ! ¨ 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
⍴ 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 → если ⍝ ⍝ если число было простым
ProveNonPrime ¨ ⍳ 15 ⍝ Доказать непростые числа для каждого(¨) целых чисел от 1 до 15 (iota 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' ⍝ Функция отображения Fibonacci
FibonacciNum ← Fibonacci Nth ; IOwas ⍝ Заголовок функции, имя функции = Фибоначчи, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число.
⍝Сгенерируйте последовательность чисел Фибоначчи, где Nth — позиция # числа Фибоначчи в последовательности. << описание функции
IOwas ← ⎕IO ⋄ ⎕IO ← 0 ⋄ FibonacciNum ← ↑ 0 1 ↓↑+ . × / Nth / ⊂ 2 2 ⍴ 1 1 1 0 ⋄ ⎕IO ← IOwas ⍝ Чтобы эта функция работала правильно, ⎕IO необходимо установить в ноль.
Фибоначчи ¨ ⍳ 14 ⍝ В этом утверждении APL говорится: Сгенерируйте последовательность Фибоначчи для каждого (¨) целого числа (йота или ⍳) для целых чисел от 1 до 14.
0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Сгенерированная последовательность, т. е. последовательность чисел Фибоначчи, сгенерированная интерпретатором APL.
Дальнейшее чтение [ править ]
- Поливка, Раймонд П.; Пакин, Сандра (1975). APL: язык и его использование . Прентис-Холл. 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 Primer Student Text» , 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=
игнорируется ( помогите )