Эта статья может потребовать очистки, чтобы соответствовать стандартам качества Википедии . Конкретная проблема: у этой статьи нестандартный макет и форматирование. ( Октябрь 2015 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Эта статья содержит исходный код APL . Без надлежащей поддержки рендеринга вы можете увидеть вопросительные знаки, квадраты или другие символы вместо символов APL . |
Язык программирования APL отличается тем, что является символическим, а не лексическим : его примитивы обозначаются символами , а не словами. Эти символы изначально были задуманы как математические обозначения для описания алгоритмов. [1] Программисты APL часто назначают неформальные имена при обсуждении функций и операторов (например, продукт для × /), но базовые функции и операторы, предоставляемые языком, обозначаются нетекстовыми символами.
Монадические и диадические функции [ править ]
Большинство символов обозначают функции или операторы . Монадическая функция принимает в качестве аргумента результат вычисления все на своем праве. (Модерируется обычным образом с помощью круглых скобок.) У диадической функции есть еще один аргумент, первый элемент данных слева. Многие символы обозначают как монадические, так и диадические функции, интерпретируемые в зависимости от использования. Например, ⌊3,2 дает 3, наибольшее целое число, не превышающее аргумент, а 3⌊2 дает 2, меньшее из двух аргументов.
Функции и операторы [ править ]
APL использует термин оператор в смысле Хевисайда как модератор функции, в отличие от использования того же термина в других языках программирования, как что-то, что работает с данными, ref. реляционный оператор и операторы в целом . Другие языки программирования также иногда используют этот термин как синоним функции , однако оба термина используются в APL более точно. [2] [3] [4] [5] [6] Ранние определения символов APL были очень конкретны в отношении того, как символы классифицируются. [7] Например, оператор сокращенияобозначается косой чертой и уменьшает массив по одной оси, вставляя его функциональный операнд . Пример сокращения :
× / 2 3 424 | << Эквивалентные результаты в APL >> << Оператор уменьшения / используется слева | 2 × 3 × 424 |
В приведенном выше случае, уменьшить или слэш оператора умеренных в множественно функцию. Выражение × / 2 3 4 дает скалярный результат (только 1 элемент) путем уменьшения массива умножением. Приведенный выше случай упрощен: представьте себе умножение (сложение, вычитание или деление) большего, чем просто нескольких чисел вместе. (Из вектора × / возвращает произведение всех его элементов.)
1 0 1 \ 45 6745 0 67 | << Противоположные результаты в APL >> << Развернуть диадическую функцию \ используется слева Реплицировать диадическую функцию / используется справа >> | 1 0 1/45 0 6745 67 |
Приведенные выше примеры двоичных функций [левый и правый примеры] (с использованием одного и того же символа / , правый пример) демонстрируют, как логические значения (0 и 1) могут использоваться в качестве левых аргументов для функций \ expand и / replicate для получения прямо противоположных результатов. С левой стороны двухэлементный вектор {45 67} раскрывается там, где встречаются логические нули, в результате получается трехэлементный вектор {45 0 67} - обратите внимание, как APL вставил 0 в вектор. И наоборот, с правой стороны происходит прямо противоположное - где 3-элементный вектор становится 2-элементным; логические 0 удалить элементы с помощью диадического / функция косой черты . Символы APL также работают со списками (вектором) элементов, использующих типы данных, отличные от числовых, например двухэлементный вектор символьных строк {"Яблоки" "Апельсины"} может быть заменен числовым вектором {45 67} выше.
Правила синтаксиса [ править ]
В APL нет иерархии приоритета для функций или операторов. APL не следует обычному приоритету операторов других языков программирования; например, ×
не связывает свои операнды более "жестко", чем +
. Вместо приоритета оператора APL определяет понятие области действия .
Сфера из функции определяет его аргументы . Функции давно имеют правильную область видимости : то есть они принимают в качестве правильных аргументов все, что находится справа. Диадическая функция имеет короткую левую область видимости : она принимает в качестве своих левых аргументов первую часть данных слева. Например, (крайний левый столбец ниже - это фактический программный код из пользовательского сеанса APL , с отступом = фактический ввод пользователя , без отступа = результат, возвращаемый интерпретатором APL ):
1 ÷ 2 ⌊ 3 × 4 - 5 ¯0,3333333333 1 ÷ 2 ⌊ 3 × ¯1 ¯0,3333333333 1 ÷ 2 ⌊ ¯3 ¯0,3333333333 1 ÷ ¯3 ¯0,3333333333
| << Первое примечание: скобок нет, и Шаг 2) 3 раза -1 = -3. |
Оператор может иметь операнды функции или данных и давать двоичную или монадическую функцию. Операторы давно покинули сферу деятельности. Оператор принимает в качестве левого операнда самую длинную функцию слева от него. Например:
∘. = / ⍳¨3 3 1 0 0 0 1 0 0 0 1
| APL атомной или по частям суб-анализ ( полное объяснение ): Умляут ¨ или мини двойной точка означает повторить или друг или выполнять каждые по отдельности , так Йоту повторов (в человеческой т.е. обращенных терминов, интерпретатор APL читает 3 3 над каждым использованием йотой), сжато: йоту на каждые 3 . |
Левый операнд для каждого оператора ¨
- это функция index ⍳ . Производная функция ⍳¨
используется монадически и принимает в качестве правого операнда вектор 3 3
. Левая область видимости каждого из них завершается оператором сокращения , обозначаемым косой чертой . Ее левый операнд функция выражение его часовой стрелке: внешний продукт из равных функций. Результат ∘. = / Является монадической функцией. При обычной длинной правой области видимости функции она принимает в качестве своего правого аргумента результат ⍳¨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 3 и (⍳3) ∘. = ⍳3 , называется единичной матрицей . Матрицы идентичности полезны при решении определителей матриц , групп линейных уравнений и множественной регрессии . |
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. Переменная Find : задается, что искать в буквах, и ее длина составляет 4 символа. 1 2 3 4 5 << позиции векторов или номера индексов буквами Слева диадическая функция iota ищет в своем левом аргументе (буквах) строку поиска (правый аргумент iota, FindIt). Йота находит букву «С» в положении 3 в Letters, он находит «А» в положении 1, и «В» в положении 2. Йота вовсе не находит букву «S» , в любом месте переменной Letters, поэтому он возвращает число 6, которое на 1 больше, чем длина Letters. Йота нашла письма «КАБИНА» (3 1 2). Йота правильно не нашла "S" (6). |
Монадические функции [ править ]
Имя (а) | Обозначение | Смысл | Кодовая точка Unicode |
---|---|---|---|
Рулон | ?B | Одно целое число, выбранное случайным образом из первых B целых чисел | U + 003F ? |
Потолок | ⌈B | Наименьшее целое число, большее или равное B | U + 2308 ⌈ |
Этаж | ⌊B | Наибольшее целое число меньше или равно B | U + 230A ⌊ |
Форма, Ро | ⍴B | Количество компонентов в каждом измерении B | U + 2374 ⍴ |
Нет , Тильда | ∼B | Логично: ∼1 равно 0, ∼0 равно 1 | U + 223C ∼ |
Абсолютная величина | ∣B | Величина B | U + 2223 ∣ |
Генератор индексов, Йота | ⍳B | Вектор первых B целых чисел | U + 2373 ⍳ |
Экспоненциальный | ⋆B | e в степень B | U + 22C6 ⋆ |
Отрицание | −B | Меняет знак B | U + 2212 - |
Конъюгировать | +B | Комплексное сопряжение B (действительные числа возвращаются без изменений) | U + 002B + |
Signum | ×B | ¯1, если B <0; 0, если B = 0; 1, если B > 0 | U + 00D7 × |
Взаимный | ÷B | 1 делить на B | U + 00F7 ÷ |
Равель, Катенат, Ламинат | ,B | Преобразует B в вектор | U + 002C , |
Матрица инверсия , монадическое деление на квадраты | ⌹B | Обратная матрица B | U + 2339 ⌹ |
Пи раз | ○B | Умножить на π | U + 25CB ○ |
Логарифм | ⍟B | Натуральный логарифм B | U + 235F ⍟ |
Разворот | ⌽B | Обратные элементы B по последней оси | U + 233D ⌽ |
Разворот | ⊖B | Обратные элементы B по первой оси | U + 2296 ⊖ |
Оценка выше | ⍋B | Индексы B, которые расположат B в порядке возрастания | U + 234B ⍋ |
Вниз | ⍒B | Индексы B, которые расположат B в порядке убывания | U + 2352 ⍒ |
Выполнять | ⍎B | Выполнить выражение APL | U + 234E ⍎ |
Монадический формат | ⍕B | Символьное представление B | U + 2355 ⍕ |
Монадическое транспонирование | ⍉B | Поменять оси B | U + 2349 ⍉ |
Факториал | !B | Произведение целых чисел от 1 до B | U + 0021 ! |
Диадические функции [ править ]
Имя (а) | Обозначение | Смысл | Кодовая точка Unicode |
---|---|---|---|
Добавлять | A+B | Сумма A и B | U + 002B + |
Вычесть | A−B | А минус В | U + 2212 - |
Умножить | A×B | Умножается на B | U + 00D7 × |
Разделять | A÷B | A делится на B | U + 00F7 ÷ |
Возведение в степень | A⋆B | Повышен до 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 | Через различные целые числа , выбранные случайным образом из первых B целых чисел | U + 003F ? |
Членство, Эпсилон | A∈B | 1 для элементов A, присутствующих в B ; 0 где нет. | U + 2208 ∈ |
Максимум , потолок | A⌈B | Большее значение A или B | U + 2308 ⌈ |
Минимум , Этаж | A⌊B | Меньшее значение A или B | U + 230A ⌊ |
Reshape, диадический Ро | A⍴B | Массив формы A с данными B | U + 2374 ⍴ |
Брать | 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 ⍳ |
Разделение матрицы, разделение на два квадрата | A⌹B | Решение системы линейных уравнений , множественная регрессия A x = B | U + 2339 ⌹ |
Вращение | A⌽B | Элементы B повернуты на позиции A | U + 233D ⌽ |
Вращение | A⊖B | Элементы B повернуты на позиции A по первой оси | U + 2296 ⊖ |
Логарифм | A⍟B | Логарифм B по основанию A | U + 235F ⍟ |
Диадический формат | A⍕B | Форматировать B в символьную матрицу согласно A | U + 2355 ⍕ |
Общее транспонирование | A⍉B | Оси B упорядочены по A | U + 2349 ⍉ |
Комбинации | A!B | Количество комбинаций B, взятых A за раз | U + 0021 ! |
Диэрезис, Дерезис, Двойная точка | A¨B | Над каждым, или выполнять каждое отдельно; B = на них; A = операция, которую нужно выполнить или использовать (например, йота) | U + 00A8 ¨ |
Меньше, чем | A < B | Сравнение: 1, если правда, 0, если ложь | U + 003C < |
Меньше или равно | A≤B | Сравнение: 1, если правда, 0, если ложь | U + 2264 ≤ |
Равный | A=B | Сравнение: 1, если правда, 0, если ложь | U + 003D = |
Больше или равно | A≥B | Сравнение: 1, если правда, 0, если ложь | U + 2265 ≥ |
Лучше чем | A>B | Сравнение: 1, если правда, 0, если ложь | U + 003E > |
Не равный | A≠B | Сравнение: 1, если правда, 0, если ложь | U + 2260 ≠ |
Или же | 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 Or | U + 2371 ⍱ |
Nand | A⍲B | Логическая логика: 0, если и A, и B равны 1, иначе 1. Alt: ~ ∧ = not And | U + 2372 ⍲ |
Оставили | A⊣B | А | U + 22A3 ⊣ |
Правильно | A⊢B | B | U + 22A2 ⊢ |
Операторы и индикатор оси [ править ]
Имя (а) | Символ | Пример | Значение (примера) | Последовательность кодовой точки Unicode |
---|---|---|---|---|
Уменьшить (последняя ось), косая черта | / | +/B | Сумма по B | U + 002F / |
Уменьшить (первая ось) | ⌿ | +⌿B | Суммируйте B | U + 233F ⌿ |
Сканирование (последняя ось), обратная косая черта | \ | +\B | Текущая сумма по B | U + 005C \ |
Сканирование (первая ось) | ⍀ | +⍀B | Текущая сумма вниз B | U + 2340 ⍀ |
Внутренний продукт | . | A+.×B | Продукт матрицы из A и B | U + 002E . |
Внешний продукт | ∘. | A∘.×B | Внешний продукт из A и B | U + 2218 ∘ , U + 002E . |
Примечания: Операторы сокращения и сканирования ожидают, что слева от них будет двоичная функция, которая образует монадическую составную функцию, применяемую к вектору справа.
Оператор продукта "." ожидает диадическую функцию как слева, так и справа, образуя диадическую составную функцию, применяемую к векторам слева и справа. Если функция слева от точки - «∘» (обозначающая ноль), то составная функция является внешним продуктом, в противном случае - внутренним продуктом. Внутренний продукт, предназначенный для обычного умножения матриц, использует функции + и ×, замена их другими двоичными функциями может привести к полезным альтернативным операциям.
За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т. Е. Он появляется между функцией и массивом, и его не следует путать с индексами массива, записанными после массива. Например, учитывая функцию ⌽ (разворота) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:
A ← 4 3 ⍴⍳ 12 A 1 2 3 4 5 6 7 8 9 10 11 12 ⌽ A 3 2 1 6 5 4 9 8 7 12 11 10 ⌽ [ 1 ] A 10 11 12 7 8 9 4 5 6 1 2 3 ⊖⌽ А 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 отражается как по вертикали ⊖, так и по горизонтали ⌽ . Является ⍉ транспонированным до 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]
Пользовательская сессия с интерпретатором 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; col 2] заменяется (с 7) на вложенный вектор «Текст» с помощью функции enclose ⊂ . Элемент в X [строка 3; col 4], ранее целое число 14, теперь становится миниатюрной замкнутой или ⊂ вложенной матрицей 2x2 из 4 последовательных целых чисел. Поскольку X содержит числа , текст и вложенные элементы , это как смешанный, так и вложенный массив. |
Управление потоком [ править ]
Пользователь может определять собственные функции , которые, как переменные, которые идентифицируются по имени , а не по нетекстовому символу. В заголовке функции определяет , является ли пользовательская функция niladic (без аргументов), монадическая (один правый аргумент) или двоично - (левый и правый аргументы), локальное имя результата (слева из ← правопреемником стрелка), и является ли она имеет любые локальные переменные (каждая разделена точкой с запятой ';').
Ниладова функция PI или π (pi) | Monadic функция CIRCLEAREA | Диадическая функция SEGMENTAREA с локальными переменными |
---|---|---|
∇ РЕЗУЛЬТАТ ← ПИ РЕЗУЛЬТАТ ← ○ 1 ∇ | ∇ ОБЛАСТЬ ← CIRCLEAREA RADIUS - ПЛОЩАДЬ ← PI × RADIUS ⋆ 2 ∇ | ∇ ОБЛАСТЬ ← РАДИУС СЕГМЕНТАЛЬНОЙ ЗОНЫ ГРАДУСОВ ; ФРАКЦИЯ ; CA ФРАКЦИИ ← Degrees ÷ 360 CA ← CIRCLEAREA RADIUS РАЙОН ← ФРАКЦИИ × CA ∇ |
Независимо от того, являются ли функции с одним и тем же идентификатором, но с разной адичностью , разными, зависит от реализации. Если разрешено, то функция CURVEAREA может быть определена дважды, чтобы заменить как монадическую CIRCLEAREA, так и диадическую SEGMENTAREA, указанную выше, при этом монадическая или диадическая функция выбирается контекстом, в котором на нее ссылаются.
Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, т. Е. Массивы должны либо иметь одинаковое количество элементов, либо один из них должен иметь один расширенный элемент. Есть исключения из этого, например, функция для преобразования недесятичной валюты Великобритании в доллары должна будет принимать параметр с ровно тремя элементами, представляющими фунты, шиллинги и пенсы. [11]
Внутри программы или пользовательской функции управление может быть условно передано оператору, идентифицированному номером строки или явной меткой; если целью является 0 (ноль), это завершает программу или возвращается к вызывающей функции. Наиболее распространенная форма использует функцию сжатия APL, как в шаблоне (условие) / цель, который имеет эффект оценки условия до 0 (ложь) или 1 (истина), а затем использования этого для маскировки цели (если условие false игнорируется, если true, остается в покое, поэтому управление передается).
Следовательно, функция SEGMENTAREA может быть изменена на прерывание (чуть ниже), возвращая ноль, если параметры (ГРАДУСЫ и РАДИУС ниже) имеют разные знаки:
∇ ОБЛАСТЬ ← РАДИУС СЕГМЕНТАЛЬНОЙ ЗОНЫ ГРАДУСОВ ; ФРАКЦИЯ ; CA ; ЗНАК ⍝ локальные переменные , обозначенная точка с запятой (;) ФРАКЦИИ ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS ⍝ это АПЗ операторы кода вызывает функцию пользователя CIRCLEAREA, определены с точностью выше. ЗНАК ← ( × ГРАДУСОВ ) ≠ × RADIUS ⍝ << APL логик TEST / определить , делают ли ГРАДУСЫ и RADIUS NOT (≠ используется) имеют одинаковый знак 1-да разные (≠), 0-нет ( тот же знак) AREA ← 0 ⍝ по умолчанию значение AREA set = ноль → SIGN / 0 ⍝ ветвление (в данном случае выход) происходит, когда SIGN = 1, в то время как SIGN = 0 НЕ ведет к 0. Переход к 0 завершает функцию. ПЛОЩАДЬ ← ФРАКЦИЯ × CA ∇
Вышеупомянутая функция SEGMENTAREA работает, как ожидалось, если параметры являются скалярами или одноэлементными массивами , но не если они являются многоэлементными массивами, поскольку условие в конечном итоге основано на одном элементе массива SIGN - с другой стороны, пользователь функция может быть изменена для правильной обработки векторизованных аргументов. Работа иногда может быть непредсказуемой, поскольку APL определяет, что компьютеры с возможностями векторной обработки должны распараллеливать и могут переупорядочивать операции с массивами, насколько это возможно, - таким образом, тестируйте и отлаживайте пользовательские функции.особенно если они будут использоваться с векторными или даже матричными аргументами. Это влияет не только на явное применение настраиваемой функции к массивам, но и на ее использование везде, где можно разумно использовать двоичную функцию, например, при создании таблицы результатов:
90 180 270 ¯90 ∘. СЕГМЕНТАЛЬНАЯ ЗОНА 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0
Более сжатый, а иногда и лучший способ - сформулировать функцию - это избегать явной передачи управления, вместо этого использовать выражения, которые правильно оцениваются во всех или ожидаемых условиях. Иногда правильно позволить функции выйти из строя, когда один или оба входных аргумента неверны - именно для того, чтобы дать пользователю знать, что один или оба использованных аргумента были неверными. Следующее является более кратким, чем приведенная выше функция SEGMENTAREA. Приведенное ниже, что важно, правильно обрабатывает векторизованные аргументы:
∇ ОБЛАСТЬ ← РАДИУС СЕГМЕНТАЛЬНОЙ ЗОНЫ ГРАДУСОВ ; ФРАКЦИЯ ; CA ; ЗНАК ФРАКЦИИ ← Degrees ÷ 360 CA ← CIRCLEAREA RADIUS SIGN ← ( × ГРАДУСОВ ) ≠ × RADIUS AREA ← ФРАКЦИИ × CA × ~ SIGN ⍝ это APL утверждение является более сложным, как однострочника - но он решает векторизованную аргументы: компромисс - сложность против ветвления ∇ 90 180 270 ¯90 ∘. СЕГМЕНТАЛЬНАЯ ЗОНА 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 ⍝ |
RightArrow, Branch, GoTo | → | →This_Label | → This_Label отправляет выполнение APL в This_Label: | U + 2192 → |
Назначить, Стрелка влево, Установить в | ← | B←A | B ← A устанавливает значения и форму B для соответствия A | U + 2190 ← |
Большинство реализаций APL поддерживают ряд системных переменных и функций, которым обычно предшествуют символы ⎕ (quad) и или ")" ( крючок = закрывающая скобка). Особенно важна и широко применяется переменная ⎕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 значение = 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 и программы для обработки. Если это число становится низким или приближается к нулю, компьютеру может потребоваться больше оперативной памяти (ОЗУ), места на жестком диске или их комбинации для увеличения виртуальной памяти . |
) VARS X | ) VARS системная функция в APL, [15] ) VARS показывает имена пользовательских переменных, существующие в текущей рабочей области. |
Существуют также системные функции, доступные пользователям для сохранения текущего рабочего пространства, например, ) SAVE и завершения среды APL, например, ) OFF - иногда называемые командами или функциями ловушки из-за использования первой правой круглой скобки или ловушки. [16] Существует некоторая стандартизация этих функций quad и hook.
Шрифты [ править ]
Базовая многоязычная плоскость Unicode включает символы APL в блоке Miscellaneous Technical [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 для визуального изображения треугольника Паскаля:
Паскаль ← { 0 ~ ¨⍨ a ⌽⊃⌽∊ ¨ 0 , ¨¨ a ∘ ! ¨ a ← ⌽⍳ ⍵ } ⍝ Создайте однострочную пользовательскую функцию под названием Pascal Pascal 7 ⍝ Запустите функцию Pascal для семи строк и покажите результаты ниже: 1 1 2 1 3 3 1 4 6 4 1 5 10 10 5 1 6 15 20 15 6 1 7 21 35 35 21 7
Простые числа, противопоказано доказательство с помощью факторов [ править ]
Определите количество простых чисел (простое число - это натуральное число больше 1, которое не имеет положительных делителей, кроме 1 и самого себя) до некоторого числа N. Кену Айверсону приписывают следующее однострочное решение APL для этой проблемы:
⎕CR 'PrimeNumbers' ⍝ Показать пользовательскую функцию APL PrimeNumbers Primes ← PrimeNumbers N ⍝ Функция принимает один правый аргумент N (например, показывает простые числа для 1 ... int N) Простые числа ← ( 2 = + ⌿ 0 = ( ⍳ N ) ∘. | ⍳ Н ) / ⍳ N ⍝ Кен Айверсон один вкладыш 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 ⍴ Простые числа 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 ⍝ Докажите непростые числа для каждого (of) целых чисел от 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' ⍝ Функция отображения Fibonacci FibonacciNum ← Fibonacci Nth ; IOwas ⍝ Заголовок функции, имя функции = Фибоначчи, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число. ⍝Создайте упорядоченное число Фибоначчи, где N-й - номер позиции числа Фибоначчи в последовательности. << описание функции 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.
- Reiter, Clifford A .; Джонс, Уильям Р. (1990). APL с математическим акцентом (1-е изд.). Тейлор и Фрэнсис. ISBN 978-0534128647.
- Томпсон, Норман Д.; Поливка, Раймонд П. (2013). APL2 in Depth (Springer Series in Statistics) (Мягкая обложка) (Перепечатка оригинального 1-го изд.). Springer. ISBN 978-0387942131.
- Гилман, Леонард; Роуз, Аллен Дж. (1976). APL: интерактивный подход (мягкая обложка) (3-е изд.). ISBN 978-0471093046.
См. Также [ править ]
- Разное техническое - блок Unicode, включая ключи APL
- APL (кодовая страница) § Раскладка клавиатуры - более современная информация о раскладке клавиатуры APL
Ссылки [ править ]
- ^ Айверсон, Кеннет Э. (1962-01-01). «Язык программирования». Труды 1-3 мая 1962 года, весна Joint Computer конференции . AIEE-IRE '62 (весна). Нью-Йорк, Нью-Йорк, США: ACM: 345–351. DOI : 10.1145 / 1460833.1460872 .
- ^ Баронет, Дэн. «Операторы Sharp APL» . archive.vector.org.uk . Фото со стока - Журнал Британской ассоциации APL . Проверено 13 января 2015 года .
- ^ MicroAPL. «Примитивные операторы» . www.microapl.co.uk . MicroAPL . Проверено 13 января 2015 года .
- ^ MicroAPL. «Операторы» . www.microapl.co.uk . MicroAPL . Проверено 13 января 2015 года .
- ^ Прогопедия. «АПЛ» . progopedia.com . Прогопедия . Проверено 13 января 2015 года .
- ^ Дьялог. «D-функции и операторы, свободно сгруппированные по категориям» . dfns.dyalog.com . Дьялог . Проверено 13 января 2015 года .
- ^ IBM. «Справочное руководство по IBM 5100 APL» (PDF) . bitsavers.trailing-edge.com . IBM. Архивировано 14 января 2015 года из оригинального (PDF) . Проверено 14 января 2015 года .
- ^ Браун, Джим (1978). «В защиту происхождения индекса 0». ACM SIGAPL APL Quote Quad . 9 (2): 7. DOI : 10,1145 / 586050,586053 .
- ^ MicroAPL. «Руководство по языку APLX» (PDF) . www.microapl.co.uk . MicroAPL - версия 5. 0 июня 2009 г. с. 22 . Проверено 31 января 2015 года .
- ^ Benkard, J. Philip (1992). «Вложенные массивы и операторы: некоторые проблемы в глубине». ACM SIGAPL APL Quote Quad . 23 (1): 7–21. DOI : 10.1145 / 144045.144065 . ISBN 978-0897914772.
- ^ Берри, Пол "APL \ 360 Primer Student Text" , IBM Research, Исследовательский центр Томаса Дж. Уотсона, 1969.
- ^ «Трактат» (PDF) . www.cs.utexas.edu . Проверено 10 сентября 2019 .
- ^ Кейсон, Стэн. «Библиотека идиом APL2» . www-01.ibm.com . IBM . Проверено 1 февраля 2015 года .
- ^ APL "высокий минус" применяется к единственному последующему числу, в то время как монадическая функция минус изменяет знак всего массива вправо.
- ^ «Рабочая область - Системные функции» . Microapl.co.uk. п. (в нижней части веб-страницы) . Проверено 5 ноября 2018 .
- ^ "Справочник по языку APL" (PDF) . Проверено 5 ноября 2018 .
- ^ Таблица Unicode «Разное техническое (включая APL)» (PDF) .
Внешние ссылки [ править ]
- Ссылка на символы APL: страница 1 , страница 2 , страница 3 , страница 4
- Страница шрифтов Британской ассоциации APL
- Кодовая страница IBM 293, также известная как кодовая страница APL на мэйнфреймах
- Общая информация о APL-символах в APL wiki
- расширение APL и его символы-операторы клавиатуры.
- Ли, Ха. «Как создать раскладку клавиатуры APL или математических символов» . Проверено 13 января 2015 года .
Общие онлайн-руководства [ править ]
- Практическое введение в APL 1 и APL 2 Грэм Дональд Робертсон
- APL для ПК, серверов и планшетов - полнофункциональный NARS , без ограничений, бесплатно загружаемый APL / 2 с вложенными массивами от Sudley Place Software
- Бесплатно загружаемый интерпретатор GNU APL для APL от Юргена Зауэрмана
- YouTube APL Tutorials, загруженные Чимином Паком, 8 вводных / обучающих видео для начинающих.
- Список скомпилированных руководств SIGAPL
- Learn APL: Учебное пособие по APL от MicroAPL
Правила синтаксиса [ править ]
- Игра Конвея в жизни в APL, на YouTube
- Айверсон, Кеннет Э. (1983). «Синтаксис и семантика APL» . ACM SIGAPL APL Quote Quad . 13 (3): 223–231. DOI : 10.1145 / 800062.801221 . ISBN 978-0897910958.
- Гффер, М. (1989). «Будущее APL: примеры и проблемы» . ACM SIGAPL APL Quote Quad . 19 (4): 158–163. DOI : 10.1145 / 75144.75166 . ISBN 978-0897913270.