Синтаксис и символы APL

редактировать
Используется специально для написания программ на языке программирования APL

Язык программирования APL отличается тем, что является символическим, а не лексическим: его примитивы обозначаются символами, а не словами. Эти символы изначально были разработаны как математическая нотация для описания алгоритмов. Программисты APL часто назначают неформальные имена при обсуждении функций и операторов (например, продукт для × /), но основные функции и операторы, предоставляемые языком, обозначаются нетекстовыми символами.

Содержание
  • 1 Монадические и диадические функции
  • 2 Функции и операторы
  • 3 Правила синтаксиса
  • 4 Монадические функции
  • 5 Диадические функции
  • 6 Операторы и индикатор оси
  • 7 Вложенные массивы
  • 8 Управление потоком
  • 9 Разное
  • 10 Шрифты
  • 11 Функция клавиатуры APL2 для отображения символов
  • 12 Решение головоломок
    • 12.1 Треугольник Паскаля
    • 12.2 Простые числа, противодействие с помощью множителей
    • 12.3 Последовательность Фибоначчи
  • 13 Дополнительная литература
  • 14 См. Также
  • 15 Ссылки
  • 16 Внешние ссылки
    • 16.1 Общие онлайн-руководства
    • 16.2 Правила синтаксиса
Монадические и диадические функции

Большинство символов обозначают функции или операторы. Монадическая функция принимает в качестве аргумента результат оценки всего, что находится справа. (Модерируется обычным образом круглыми скобками.) У диадической функции есть еще один аргумент, первый элемент данных слева от нее. Многие символы обозначают как монадические, так и диадические функции, интерпретируемые в зависимости от использования. Например, ⌊3,2 дает 3, наибольшее целое число, не превышающее аргумент, а 3⌊2 дает 2, меньшее из двух аргументов.

Функции и операторы

APL использует термин оператор в смысле Хевисайда как модератор функции, в отличие от использования того же термина в других языках программирования, как то, что работает с данными, исх. оператор отношения и обычно операторы. Другие языки программирования также иногда используют этот термин как синоним функции, однако оба термина используются в APL более точно. Ранние определения символов APL были очень конкретными в отношении того, как символы классифицируются. Например, оператор reduce обозначается косой чертой и сокращает массив вдоль одной оси, вставляя его функциональный операнд. Пример сокращения :

× / 2 3 4 24
<< Эквивалент приводит к APL>>
<< оператору уменьшения/, используемому слева
2 × 3 × 4 24

В приведенном выше случае оператор reduceили косая чертамодерирует функцию умножения. Выражение × / 2 3 4оценивается как скалярный (только 1 элемент) результат посредством уменьшениямассива путем умножения. Приведенный выше случай упрощен: представьте себе умножение (сложение, вычитание или деление) большего, чем просто нескольких чисел вместе. (Из вектора × /возвращает произведение всех его элементов.)


1 0 1 \ 45 67 45 0 67
<< Напротив приводит к APL>>
<< Развернутьдиадическая функция \используется слева
Уменьшитьдиадическая функция /используется справа>>
1 0 1/45 0 67 45 67

Приведенные выше примеры диадических функций [левый и правый примеры] (с использованием одного и того же символа /, правый пример) демонстрируют, как логические значения (0 и 1) могут использоваться в качестве левых аргументов для функций \ expandи / replicateдля получения прямо противоположных результатов. Слева 2-элементвектор {45 67} является расширенным, где логические 0 приводят к 3-элементномувектор {45 0 67} - обратите внимание, как APL вставил 0 в вектор. И наоборот, с правой стороны происходит прямо противоположное - где 3-элементный вектор становится 2-элементным; логические 0 удаляют элементы с помощью двоичной функции / косой черты. Символы APL также работают со списками (вектор) элементов, использующих типы данных, отличные от числовых, например, двухэлементный вектор символьных строк {"Яблоки" "Апельсины"} может быть заменен числовым вектором { 45 67} выше.

Правила синтаксиса

В APL нет иерархии приоритета для функций или операторов. APL не следует обычному приоритету операторов других языков программирования; например, ×не связывает свои операнды более "жестко", чем +. Вместо приоритета оператора APL определяет понятие области действия.

Область действия функции определяет ее аргументы. Функции давно имеют правильную область видимости: то есть они принимают в качестве правильных аргументов все, что находится справа. Диадическая функция имеет короткую левую область видимости: она принимает в качестве своих левых аргументов первую часть данных слева. Например, (крайний левый столбец ниже - это фактический программный код из пользовательского сеанса APL , с отступом = фактический пользовательский ввод, без отступа = результат, возвращенный Интерпретатор APL ): ​​

1 ÷ 2 ⌊ 3 × 4 - 5 ¯0,3333333333 1 ÷ 2 ⌊ 3 × ¯1 ¯0,3333333333 1 ÷ 2 ⌊ ¯3 ¯0,3333333333 1 ÷ ¯3 ¯0,3333333333

<< First note there are no parentheses and
APL будет выполняться справа налево.
Шаг 1 {верхнего кода APL, введенного слева}) 4-5 = -1.

Шаг 2) 3 раза -1 = -3.
Шаг 3) Возьмите этажили нижеиз 2 и -3 = -3.
Шаг 4) Разделите 1 на -3 = -0,3333333333 = окончательный результат.


Оператор может иметь функцию или данные операнды и оценивать двоичную или монадическую функцию. Операторы давно покинули сферу деятельности. Оператор принимает в качестве левого операнда самую длинную функцию слева от него. Например:

∘. = / ⍳¨3 3 1 0 0 0 1 0 0 0 1

APL атомарный или частичный субанализ (полное объяснение):
Крайнее начало справа: ⍳¨3 3 создает 2-элементный вложенный вектор APL {{1 2 3} {1 2 3}}, где каждый элемент сам является вектором {1 2 3}. Iota ⍳3сама по себе создаст {1 2 3}.

диэрезис ¨или двойная мини-точка означает повторение или для каждогоили выполнение каждого отдельно, поэтому йота повторяется(у человека, т. Е. Обратное термины, интерпретатор APL читает 3 3 на каждую йоту использования), кратко: йота для каждых 3.

Левый операнд для для каждого оператора¨- это индекс ⍳функция. Производная функция ⍳¨используется монадически и принимает в качестве своего правого операнда вектор 3 3. Левая область видимости каждогозавершается оператором reduce, обозначенным прямой косой чертой. Его левый операнд - это выражение функции слева от него: внешний продукт функции равен. Результат ∘. = / Является монадической функцией. При обычной длинной правой области видимости функции она принимает в качестве своего правого аргумента результат 3 3. Таким образом,

(⍳3) (⍳3)1 2 3 1 2 3 (⍳3) ∘. = ⍳31 0 0 0 1 0 0 0 1 ⍳¨3 3 1 2 3 1 2 3 ∘. = / ⍳¨3 31 0 0 0 1 0 0 0 1


Эквивалентные результаты в APL: (⍳3)(⍳3)и ⍳¨3 3<< Rightmost expression is more concise.

Матрица единиц и нулей, полученная аналогично по ∘. = / ⍳¨3 3и (⍳3)∘.=⍳3называется тождеством матрица.

Матрицы идентичности полезны при решении определителей матрицы, групп линейных уравнений и множественной регрессии.


im ← ∘. = ⍨∘⍳ im 3 1 0 0 0 1 0 0 0 1

Некоторые интерпретаторы APL поддерживают оператор composeи оператор коммутировать. Первый ∘ склеивает функциивместе, так что foo∘bar , например, может быть гипотетической функцией, которая применяет определенную функцию foo к результату определенной панели функций ; foo и bar могут представлять любую существующую функцию. В случаях, когда диадическая функция модерируется коммутируют, а затем используется монадически, ее правый аргумент также принимается как ее левый аргумент. Таким образом, производная от или составная функция(названная im слева) используется в пользовательском сеансе APL для возврата 9- элементной матрицы идентичности с использованием ее правого аргумент, параметр или операнд = 3.


Буквы ← «ABCDE» Буквы ABCDE ⍴Буквы 5 FindIt ← «CABS» FindIt CABS ⍴FindIt 4 буквы ⍳ FindIt 3 1 2 6

Пример использования APL для индекса или найти элементы(или не найти) в векторе символов :

Сначала переменной Lettersприсваивается вектор 5 элементов, в данном случае - буквы алфавита.

Форма или длина вектора символов буквравна 5.

Переменной FindItназначается то, что найдитев буквах, и его длина составляет 4 символа.

1 2 3 4 5 << vector positions or index #'s in Буквы
ABCDE

Слева двоичная функция iota ищетчерез свой левый аргумент (Буквы) для строка поиска (правый аргумент йоты, FindIt).

Iota находит букву "C" в позиции 3 в буквах, она находит "A" в позиции 1 и "B" в позиции 2. Iotaне не находитбуква «S»

в любом месте переменной Letters, поэтому она возвращает число 6, которое на 1 больше, чем длинабукв. Iotaобнаружил буквы

"CAB" (3 1 2). Йотаправильно сделал не нашел"S" (6).

Монадические функции
Имя (я)ОбозначениеЗначениеКодовая точка Unicode
Roll?BОдно целое число, выбранное случайным образом из первого B целые числаU + 003F?
Потолок ⌈BНаименьшее целое число, большее или равное BU + 2308 ⌈
Пол ⌊BНаибольшее целое число, меньшее или равное BU + 230A ⌊
Форма, Rho ⍴BКоличество компонентов в каждом измерении BU + 2374 ⍴
Not, Тильда ∼BЛогическое: ∼1 равно 0, ∼0 равно 1U + 223C ∼
Абсолютное значение ∣BВеличина BU + 2223 ∣
Генератор индекса, Iota ⍳BВектор первых B целых чиселU + 2373 ⍳
Экспонента ⋆Be в степени BU + 22C6 ⋆
Отрицание −BМеняет знак BU + 2212 -
Идентичность +BБез изменений на BU + 002B +
Signum ×B¯1, если B <0; 0 if B=0; 1 if B>0U + 00D7 ×
Взаимное ÷B1, деленное на BU + 00F7 ÷
Равель, Катенат, Ламинат,BПреобразует B в векторU + 002C,
Матрица, обратная, Monadic Quad Divide⌹B, обратная матрице BU + 2339 ⌹
Pi раз○BУмножается на πU + 25CB ○
Логарифм ⍟BНатуральный логарифм BU + 235F ⍟
Реверс⌽BОбратные элементы B по последней осиU + 233D ⌽
R eversal⊖BОбратные элементы B вдоль первой осиU + 2296 ⊖
Повышение уровня⍋BУказатели B, которые будут располагать B в порядке возрастанияU + 234B ⍋
Понижение уровня⍒BИндексы B, которые упорядочивают B в порядке убыванияU + 2352 ⍒
Выполнить ⍎BВыполнить выражение APLU + 234E ⍎
Монадический формат⍕BСимвольное представление BU + 2355 ⍕
Монадический транспонировать ⍉BПоменять местами оси BU + 2349 ⍉
Факториал !BПроизведение целых чисел от 1 до BU + 0021!
Двоичные функции
Имя (я)ОбозначениеЗначениеКодовая точка Unicode
Добавить A + BСумма A и BU + 002B +
Вычесть A − BA минус BU + 2212 -
Умножить A × BA умножить на BU + 00D7 ×
Разделить A ÷ BA разделить на BU + 00F7 ÷
Возведение в степень A⋆BA возведено в степень BU + 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?
Членство, EpsilonA∈B1 для элементов A, присутствующих в B; 0 где нет.U + 2208 ∈
Максимум, потолокA⌈BБольшее значение A или BU + 2308 ⌈
Минимум, этажA⌊BМеньшее значение A или BU + 230A ⌊
Reshape, Dyadic Rho A⍴BМассив формы A с данными BU + 2374 ⍴
TakeA ↑ BВыбрать первый (или последний) элемент A из B согласно × AU + 2191 ↑
DropA ↓ BУдалить первый (или последний) элемент A из B в соответствии с × AU + 2193 ↓
ДекодироватьA⊥BЗначение полинома, коэффициенты которого равны B в AU + 22A5 ⊥
КодироватьA⊤BПредставление Base-A значения BU + 22A4 ⊤
Остаток A∣BB по модулю AU + 2223 ∣
СвязьA, BЭлементы B, добавленные к элементам AU + 002C,
Expansion, Dyadic BackslashA \ BВставить нули (или пробелы) в B, соответствующие нулям в AU + 005C \
Сжатие, двойная косая чертаA / BВыбрать элементы в B, соответствующие единицам в AU + 002F /
Указатель, D yadic Iota A⍳BМестоположение (индекс) B в A; 1 + ⍴A, если не найденоU + 2373 ⍳
Матричное деление, двухквадратное делениеA⌹BРешение системы линейных уравнений, множественная регрессия Ax = BU + 2339 ⌹
ВращениеA⌽BЭлементы B вращаются в положениях AU + 233D ⌽
ВращениеA⊖BЭлементы B вращаются в позиции A вдоль первой осиU + 2296 ⊖
Логарифм A⍟BЛогарифм B по основанию AU + 235F ⍟
Диадический форматA⍕BФормат B в матрицу символов согласно AU + 2355 23
Общее транспонированиеA⍉Bоси B упорядочены по AU + 2349 ⍉
КомбинацииA! BКоличество комбинаций B, взятых A за разU + 0021!
Диэрезис, Дерезис, Двойная точкаA¨BНад каждым или выполнять каждое отдельно; B = на них; A = операция, которую нужно выполнить или использовать (например, йота)U + 00A8 ¨
МеньшеA < BСравнение: 1, если истина, 0, если ложьU + 003C <
Меньше или равноA≤BСравнение: 1, если истина, 0, если ложьU + 2264 ≤
Равно A = BСравнение: 1, если истина, 0, если ложьU + 003D =
Больше или равноA≥BСравнение: 1, если истина, 0, если ложьU + 2265 ≥
Больше, чемA>BСравнение : 1, если истина, 0, если ложьU + 003E>
Не равноA ≠ BСравнение: 1, если правда, 0, если ложьU + 2260 ≠
Or A∨ BЛогическая логика: 0(False), если иA, и B = 0, иначе 1. Alt: 1(True), если A илиB = 1(True)U + 2228 ∨
И A∧BЛогическая логика: 1(Истина), если иA , иB = 1, 0 (Ложь) в противном случаеU + 2227 ∧
Nor A⍱BЛогическая логика: 1, если и A, и B равны 0, в противном случае 0. Alt: ~ not = нет ИлиU + 2371 ⍱
Nand A⍲BЛогическая логика: 0, если и A, и B равны 1, иначе 1. Alt: ~ ∧ = not AndU + 2372 ⍲
LeftA⊣BAU + 22A3 ⊣
справаA⊢BBU + 22A2 ⊢
Операторы и указатель оси
Имя (я)СимволПримерЗначение (пример)Последовательность кодовых точек Unicode
Уменьшение (последняя ось), косая черта/+ / BСумма по BU + 002F /
Уменьшение (первая ось)+ ⌿BСуммирование BU + 233F ⌿
Сканирование (последняя ось), обратная косая черта\+ \ BТекущая сумма по BU + 005C \
Сканирование (первая ось)+ ⍀BТекущая сумма вниз BU + 2340 ⍀
Внутреннее произведение.A +. × BМатричный продукт из A и BU + 002E.
Внешний продукт∘.A∘. × BВнешний продукт из A и BU + 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


Матрица из 4 строк по 3 столбца создана с использованием rho ⍴и iota ⍳. Матрица 4 x 3 затем сохраняется в переменной. с именем A.

Aтеперь отражается или переворачивается вдоль вертикальной оси, как визуально указывает символ .

Aтеперь отображается с помощью индикатора оси [1]или модификатора первого измерения. В результате переменная A была отражена по горизонтальной оси, а не по вертикали.

Aтеперь отражается как по вертикали ⊖, и по по горизонтали ⌽.

A- ⍉ транспонируетсяв матрицу 3 строки на 4 столбца, так что строки-столбцы меняются местами, как Символ отображает визуально. Сравните результат здесь с исходной матрицей, хранящейся в самой верхней матрице A. Эти типы преобразований данных полезны в анализе временных рядов и пространственных координатах, всего два примера, существуют и другие.


В частном случае, если диадический catenate","за функцией следует индикатор оси (или модификатор оси для символа / функции), ее можно использовать для ламинирования (вставки) двух массивов в зависимости от того, меньше ли индикатор оси чем или больше чем начало индекса (начало индекса = 1 на иллюстрации ниже):

B ← 1 2 3 4 C ← 5 6 7 8 B, C 1 2 3 4 5 6 7 8 B , [0.5] C 1 2 3 4 5 6 7 8 B, [1.5] C 1 5 2 6 3 7 4 8

Слева переменной 'B' сначала назначается вектор из 4 последовательных целых чисел (например, ⍳4).
Var Cзатем присваивается еще 4 последовательных целых числа (например, 4 + ⍳4).
'B' и Cтогда объединенныеили объединенныевместе для целей иллюстрации,
в результате дает один вектор (⍳8). В конкретном случае слева, если диадическое catenate ","функция i s, за которым следует индикатор оси ([0.5], который меньше 1), его можно использовать для ламинирования(вставить) два массива (в данном случае векторы) в зависимости от того, больше ли индикатор оси, чем начало индекса (1). Первый результат (из B, [0.5] C) представляет собой матрицу размером 2 строки на 4 столбца, вертикально соединяющую «B» и Cпострочно. Второй результат (из B, [1.5] C, который больше 1) представляет собой матрицу 4 строки на 2 столбца.

Вложенные массивы

Массивы - это структуры, элементы которых сгруппированы линейно как векторы или в табличной форме как матрицы - и более высокие измерения (3D или кубы, 4D или куб с течением времени и т. Д.). Массивы, содержащие как символы, так и числа, называются смешанными массивами. Структуры массивов, содержащие элементы, которые также являются массивами, называются вложенными массивами.

Создание вложенного массива
Пользовательский сеанс с интерпретатором APLПояснение
X ← 4 5⍴⍳20 X 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 X [2; 2] 7 ⎕IO 1 X [1; 1] 1


Xустановить = в матрицу с 4 строками по 5 столбцов, состоящую из 20 последовательные целые числа.

Элемент X [2; 2]в строке 2 - столбец 2 в настоящее время является целым числом = 7.

Исходное начало индекса ⎕IOзначение = 1.

Таким образом, первый элемент в матрице X или X [1; 1] = 1.

X [2; 2] ← ⊂ "Text" X [3; 4] ← ⊂ (2 2⍴⍳ 4) X 1 2 3 4 5 6 Текст 8 9 10 11 12 13 1 2 15 3 4 16 17 18 19 20
Элемент в X [строка 2; col 2] заменяется (с 7) на вложенный вектор «Текст» с помощью функции enclose ⊂.


Элемент в X [строка 3; col 4], ранее целое число 14, теперь становится миниатюрной вложенной или вложенной матрицей2x2 из 4 последовательных целых чисел.

Поскольку Xсодержит числа , текст и вложенные элементы , это как смешанный, так и вложенный массив.

Визуальное представление вложенного массива
Управление потоком

Пользователь может определять пользовательские функции, которые, как и переменные, идентифицируются по имени, а не нетекстовым символом. Заголовок функции определяет, является ли настраиваемая функция ниладической (без аргументов), монадической (один правый аргумент) или диадической (левый и правый аргументы), локальным именем результата (слева от стрелки ← назначить) и будет ли она имеет любые локальные переменные (каждая из которых разделена точкой с запятой ';').

Пользовательские функции
Ниладская функция PI или π (pi)Монадическая функция CIRCLEAREAДвоичная функция SEGMENTAREA, с локальными переменными
∇ RESULT ← PI RESULT ← ○ 1 ∇
∇ ОБЛАСТЬ ← РАДИУС ОКРУЖЕНИЯ ОБЛАСТЬ ← PI × РАДИУС⋆2 ∇
∇ ОБЛАСТЬ ← ГРАДУСЫ СЕГМЕНТАЛЬНОГО РАДИУСА; ДРОБНАЯ ЧАСТЬ ; CA FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS AREA ← FRACTION × CA ∇

Отличаются ли функции с одним и тем же идентификатором, но разной степенью, определяется реализацией. Если разрешено, то функция CURVEAREA может быть определена дважды, чтобы заменить как монадическую CIRCLEAREA, так и диадическую SEGMENTAREA, указанную выше, при этом монадическая или диадическая функция выбирается контекстом, в котором на нее ссылаются.

Пользовательские диадические функции обычно могут применяться к параметрам с теми же соглашениями, что и встроенные функции, т.е. массивы должны либо иметь одинаковое количество элементов, либо один из них должен иметь один расширенный элемент. Из этого правила есть исключения: например, функция преобразования недесятичной валюты Великобритании в доллары должна будет принимать параметр с ровно тремя элементами, представляющими фунты, шиллинги и пенсы.

Внутри программы или пользовательской функции, управление может быть условно передано оператору, обозначенному номером строки или явной меткой; если целью является 0 (ноль), это завершает программу или возвращается к вызывающей функции. Наиболее распространенная форма использует функцию сжатия APL, как в шаблоне (условие) / цель, который имеет эффект оценки условия до 0 (ложь) или 1 (истина), а затем использования этого для маскирования цели (если условие false игнорируется, если true, остается в покое, поэтому управление передается).

Следовательно, функция SEGMENTAREA может быть изменена на прерывание (чуть ниже), возвращая ноль, если параметры (DEGREES и RADIUS ниже) имеют другой знак:

∇ AREA ← DEGREES SEGMENTAREA RADIUS; ДРОБНАЯ ЧАСТЬ ; CA; SIGN ⍝ локальные переменные, обозначенные точкой с запятой (;) FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS ⍝ этот оператор кода APL вызывает пользовательскую функцию CIRCLEAREA, определенную выше. ЗНАК ← (× ГРАДУСЫ) ≠ × РАДИУС ⍝ << APL logic TEST/determine whether DEGREES and RADIUS do NOT (≠ used) have same SIGN 1-yes different(≠), 0-no(same sign) AREA←0 ⍝ default value of AREA set = zero →SIGN/0 ⍝ branching(here, exiting) occurs when SIGN=1 while SIGN=0 does NOT branch to 0. Branching to 0 exits function. AREA←FRACTION×CA ∇

Вышеупомянутая функция SEGMENTAREA работает должным образом, если параметры являются скалярами или одноэлементными массивами, но не, если они являются многоэлементными массивами, поскольку условие в конечном итоге основывается на одном элементе массива SIGN - с другой стороны, пользовательская функция может быть изменена для правильной обработки векторизованных аргументов. Работа иногда может быть непредсказуемой, поскольку APL определяет, что компьютеры с возможностями векторной обработки должны распараллеливать и могут переупорядочивать операции с массивами, насколько это возможно - таким образом, тестирует и отлаживаетпользовательские функции, особенно если они будут использоваться с векторной или даже матричные аргументы. Это влияет не только на явное применение настраиваемой функции к массивам, но и на ее использование в любом месте, где можно разумно использовать двоичную функцию, например, при создании таблицы результатов:

90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4 0 0 0 0 0 0 0 0 0 0 0 0

Более краткий, а иногда и лучший способ - сформулировать функцию - это избегать явной передачи управления, вместо этого использовать выражения, которые правильно оцениваются во всех или ожидаемых условиях. Иногда правильно допустить сбой функции, когда один или оба аргумента inputявляются неверными- именно для того, чтобы дать пользователю понять, что один или оба использованных аргумента были неверными. Следующее является более кратким, чем приведенная выше функция SEGMENTAREA. Приведенный ниже важный элемент правильнообрабатывает векторизованные аргументы:

∇ AREA ← DEGREES SEGMENTAREA RADIUS; ДРОБНАЯ ЧАСТЬ ; CA; SIGN FRACTION ← DEGREES ÷ 360 CA ← CIRCLEAREA RADIUS SIGN ← (× DEGREES) ≠ × RADIUS AREA ← FRACTION × CA × ~ SIGN ⍝ этот оператор APL является более сложным, однострочным - но он решает векторизованные аргументы: компромисс - сложность по сравнению с ветвлением ∇ 90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4 0,785398163 0 12,5663706 1,57079633 0 25,1327412 2,35619449 0 37,6991118 0 ¯3,14159265 0

Предотвращение явной передачи управления, также называемой ветвлением, если ее не проверять или тщательно контролировать - можно продвигать использование чрезмерно сложных однострочников, действительно «непонятых и сложных идиом» и стиля «только для записи», который мало что сделал для того, чтобы понравиться APL таким влиятельным комментаторам, как Эдсгер Дейкстра. И наоборот, идиомы APL могут быть интересными, образовательными и полезными - если они используются с полезными комментариями , например, включая источник, предполагаемое значение и функцию идиомы (й). Вот список идиом APL, список идиом IBM APL2 здесь и финская библиотека идиом APL здесь.

Разное
Разные символы
Имя (я)СимволПримерЗначение (примера)Кодовая точка Unicode
Высокий минус¯¯3Обозначает отрицательное числоU + 00AF ¯
Лампа, Комментарий⍝Это комментарийВсе справа от ⍝ обозначает комментарийU + 235D ⍝
RightArrow, Branch, GoTo→ This_Label→ This_Label отправляет выполнение APL в This_Label:U + 2192 →
Assign, LeftArrow, Установить наB ← AB ← A устанавливает значения и форму B для соответствия AU + 2190 ←

Большинство реализаций APL поддерживают ряд системных переменных и функций, которым обычно предшествуют ⎕ (quad)и / или ")"(hook= закрывающая скобка) символ. Особенно важна и широко применяется переменная ⎕IO (Index Origin ), поскольку, хотя исходный IBM APL основывал свои массивы на 1, некоторые новые варианты основывают их на нуле:

Пользовательский сеанс с интерпретатором APLОписание
X ← ⍳12 X 1 2 3 4 5 6 7 8 9 10 11 12 ⎕IO 1 X [1] 1

Xнабор = вектор из 12 последовательных целых чисел.

Исходное начало индекса ⎕IOзначение = 1. Таким образом, первая позиция в векторе X или X [1] = 1на вектор значений йоты {12 3 4 5...}.

⎕IO ← 0 X [1] 2 X [0] 1
Источник индекса ⎕IOтеперь изменен на 0. Таким образом, «первая позиция индекса» в векторе X изменяется с 1 на 0. Следовательно, X [1]затем ссылается или указывает на 2из {1 23 4 5...} и X [0 ]теперь ссылается на 1.
⎕WA 41226371072
Quad WAили ⎕WA, другую динамическую системную переменную, показывает, сколько рабочей области остается неиспользованной или 41,226 мегабайт или около 41 гигабайт неиспользованной дополнительной общей свободной рабочей области, доступной для рабочего пространства APL и программы для обработки. Если это число становится низким или приближается к нулю - компьютеру может потребоваться больше оперативной памяти (RAM), жесткого диска пространства или их комбинации для увеличения виртуального memory.
) VARS X
) VARSсистемная функция в APL, ) VARSпоказывает имена пользовательских переменных, существующие в текущей рабочей области.

Существуют также системные функции, доступные пользователям для сохранения текущего рабочего пространства, например, ) SAVEи завершения среды APL, например, ) OFF- иногда называются командами ловушки или функциями к использованию ведущей правой круглой скобки или крючка. Существует некоторая стандартизация этих функций квадроцикла и крюка.

Шрифты

Unicode Basic Multilingual Plane включает символы APL в блоке Miscellaneous Technical, которые, таким образом, обычно точно отображаются из более крупного Unicode шрифты, установленные в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Таким образом, несмотря на точность, глифы могут показаться незнакомыми программистам APL или их трудно отличить друг от друга.

Некоторые шрифты Unicode были разработаны для правильного отображения APL: APLX Upright, APL385 Unicode и SimPL.

До Unicode интерпретаторы APL поставлялись со шрифтами, в которых символы APL отображались в менее часто используемые позиции в наборах символов ASCII, обычно в верхних 128 кодовых точках. Эти сопоставления (и их национальные варианты) иногда были уникальными для интерпретатора каждого поставщика APL, что делало отображение программ APL в Интернете, в текстовых файлах и руководствах - часто проблематичным.

Функция клавиатуры APL2 для отображения символов
Клавиатура 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) / ⍳N ⍝ Однострочные простые числа Кена Айверсона 100 ⍝ Показать все простые числа от 1 до 100 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ⍴Простые числа 100 25 ⍝ Есть двадцать пять простых чисел в диапазоне до 100.

Часто требуется изучение обратного или противоположного математического решения (целочисленные множители числа ): ​​докажите для подмножества целых чисел от 1 до 15, что они непростые, если перечислить их коэффициенты разложения. Каковы их множители, отличные от единицы (# делится на, кроме 1)?

⎕CR 'ProveNonPrime' Z ← ProveNonPrime R ⍝Показать все делители целого числа R, кроме 1 и самого числа, ⍝ т.е. доказать непростое число. Строка 'prime' возвращается для простого целого числа. Z ← (0 = (⍳R) | R) / ⍳R ⍝ Определить все множители для целого числа R, сохранить в ZZ ← (~ (Z∊1, R)) / Z ⍝ Удалить 1 и число как множители числа из Z. → (0 = ⍴Z) / ProveNonPrimeIsPrime ⍝ Если результат имеет нулевую форму, он не имеет других множителей и, следовательно, является простым Z ← R, (⊂ «множители (кроме 1)»), (⊂Z), ⎕TCNL ⍝ Покажите число R, его множители (кроме 1, самого себя) и новую строку char → 0 Завершено с функцией, если не простое число ProveNonPrimeIsPrime: Z ← R, (⊂ «prime»), TCNL ⍝ функция разветвляется здесь, если число было простым ProveNonPrime ¨⍳15 ⍝ Докажите непростые числа для каждого (¨) целых чисел от 1 до 15 (йота 15) 1 простое 2 простое 3 простых 4 множителя (кроме 1) 2 5 простых 6 множителей (кроме 1) 2 3 7 простых 8 множителей (кроме 1) 2 4 9 множителей (кроме 1) 3 10 множителей (кроме 1) 2 5 11 простых 12 множителей (кроме 1) 2 3 4 6 13 простых 14 множителей (кроме 1) 2 7 15 множителей ( кроме 1) 3 5

Последовательность Фибоначчи

Сгенерировать последовательность чисел Фибоначчи, где каждое последующее число в последовательности является суммой двух предыдущих:

⎕CR 'Fib onacci '⍝ Функция отображения Fibonacci FibonacciNum ← Fibonacci Nth; IOwas ⍝ Заголовок функции, имя функции = Fibonacci, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число. ⍝Создайте порядковое число Фибоначчи, где N-ый - номер позиции числа Фибоначчи в последовательности. << function description IOwas←⎕IO ⋄ ⎕IO←0 ⋄ FibonacciNum←↑0 1↓↑+.×/Nth/⊂2 2⍴1 1 1 0 ⋄ ⎕IO←IOwas ⍝ In order for this function to work correctly ⎕IO must be set to zero. Fibonacci¨⍳14 ⍝ This APL statement says: Generate the Fibonacci sequence over each(¨) integer number(iota or ⍳) for the integers 1..14. 0 1 1 2 3 5 8 13 21 34 55 89 144 233 ⍝ Generated sequence, i.e., the Fibonacci sequence of numbers generated by APL's interpreter.
Дополнительная литература
  • Поливка, Раймонд П.; Пакин, Сандра (1975). APL: язык и его использование. Прентис-Холл. ISBN 978-0-13-038885-8.
  • Reiter, Clifford A.; Джонс, Уильям Р. (1990). APL с математическим акцентом (1-е изд.). Тейлор и Фрэнсис. ISBN 978-0534128647.
  • Thompson, Norman D.; Поливка, Раймонд П. (2013). APL2 in Depth (Springer Series in Statistics) (Мягкая обложка) (Перепечатка оригинального 1-го изд.). Springer. ISBN 978-0387942131.
  • Гилман, Леонард; Роуз, Аллен Дж. (1976). А. П. Л.: Интерактивный подход (Мягкая обложка) (3-е изд.). ISBN 978-0471093046.
См. Также
Ссылки
Внешние ссылки

Общие онлайн-руководства

Правила синтаксиса

Последняя правка сделана 2021-06-09 01:52:31
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте