Синтаксис и символы APL - APL syntax and symbols

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

Монадические и диадические функции

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

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

APL использует термин оператор в Хевисайд Смысл модератора функции в отличие от использования какого-либо другого языка программирования того же термина как что-то, что работает с данными, исх. реляционный оператор и операторы в целом. В других языках программирования этот термин также иногда используется как синоним функция, однако оба термина используются в 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) могут использоваться в качестве левых аргументов для расширять и / реплицировать функции для получения прямо противоположных результатов. С левой стороны 2-элементный вектор {45 67} есть расширенный где логические 0 приводят к 3-элементный vector {45 0 67} - обратите внимание, как APL вставил 0 в вектор. И наоборот, с правой стороны происходит прямо противоположное - где 3-элементный вектор становится 2-элементным; логические 0 Удалить предметы, использующие диадические / слэш функция. Символы APL также действуют на списки (вектор) элементов, использующих типы данных, отличные от числовых, например, двухэлементный вектор символьных строк {"Яблоки" "Апельсины"} может быть заменен числовым вектором {45 67} выше.

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

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

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


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

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



Монадические функции

Имя (а)ОбозначениеСмыслКодовая точка Unicode
Рулон? BОдно целое число, выбранное случайным образом из первого B целые числаU + 003F ?
Потолок⌈BНаименьшее целое число больше или равно BU + 2308
Этаж⌊BНаибольшее целое число меньше или равно BU + 230A
Форма, Ро⍴BКоличество компонентов в каждом измерении BU + 2374
Нет, Тильда∼BЛогично: ∼1 равно 0, ∼0 равно 1U + 223C
Абсолютная величина∣BВеличина BU + 2223
Генератор индекса, Йота⍳BВектор первого B целые числаU + 2373
Экспоненциальный⋆Bе в B мощностьU + 22C6
Отрицание−BМеняет знак BU + 2212
Конъюгировать+ BКомплексное сопряжение B (действительные числа возвращаются без изменений)U + 002B +
Signum× B¯1, если B<0; 0 если B= 0; 1 если B>0U + 00D7 ×
Взаимный÷ B1 делится на BU + 00F7 ÷
Равель, Катенат, Ламинат, BПерекраивает B в векторU + 002C ,
Матрица обратная, Монадическое разделение на квадраты⌹BОбратная матрица BU + 2339
число Пи раз○ BУмножить на πU + 25CB
Логарифм⍟BНатуральный логарифм BU + 235F
Разворот⌽BОбратные элементы B по последней осиU + 233D
Разворот⊖BОбратные элементы B по первой осиU + 2296
Оценка выше⍋BИндексы B который устроит B в порядке возрастанияU + 234B
Вниз⍒BИндексы B который устроит B в порядке убыванияU + 2352
Выполнять⍎BВыполнить APL выражениеU + 234E
Монадический формат⍕BСимвольное представление BU + 2355
Монадический транспонировать⍉BПоменять оси BU + 2349
Факториал! BПроизведение целых чисел от 1 до BU + 0021 !

Диадические функции

Имя (а)ОбозначениеСмыслUnicode
кодовая точка
ДобавлятьА + ВСумма А и BU + 002B +
ВычестьА-БА минус BU + 2212
УмножитьA × BА умножается на BU + 00D7 ×
РазделятьA ÷ BА деленное на BU + 00F7 ÷
Возведение в степеньA⋆BА поднял до B мощностьU + 22C6
КругА ○ БТригонометрические функции B выбран А
А= 1: грех (B)    А= 5: sinh (B)А= 2: cos (B)    А= 6: ch (B)А= 3: загар (B)    А= 7: tanh (B)

Отрицательные числа производят обратные соответствующие функции

U + 25CB
Иметь делоА? БА различные целые числа, выбранные случайным образом из первого B целые числаU + 003F ?
Членство, ЭпсилонA∈B1 для элементов А присутствует в B; 0 где нет.U + 2208
Максимум, ПотолокA⌈BБольшее значение А или же BU + 2308
Минимум, ЭтажA⌊BМеньшее значение А или же BU + 230A
Изменить форму, диадический РоA⍴BМассив формы А с данными BU + 2374
БратьА ↑ БВыберите первый (или последний) А элементы B согласно ×АU + 2191
УронитьА ↓ БУдалите первый (или последний) А элементы B согласно ×АU + 2193
ДекодироватьA⊥BЗначение полинома, коэффициенты которого равны B в АU + 22A5
КодироватьA⊤BОснование-А представление ценности BU + 22A4
ОстатокA∣BB по модулю АU + 2223
ЦепочкаА, БЭлементы B добавлен к элементам АU + 002C ,
Расширение, диадическая обратная косая чертаА БВставьте нули (или пробелы) в B соответствующие нули в АU + 005C \
Сжатие, Диадический слэшА / БВыбрать элементы в B соответствующие тем в АU + 002F /
Индекс, диадический ЙотаA⍳BРасположение (индекс) B в А; 1+⍴А если не найденU + 2373
Разделение матрицы, разделение на два квадратаA⌹BРешение для система линейных уравнений, множественная регрессия Ах = BU + 2339
ВращениеA⌽BЭлементы B вращаются А позицииU + 233D
ВращениеA⊖BЭлементы B вращаются А позиции по первой осиU + 2296
ЛогарифмA⍟BЛогарифм B основать АU + 235F
Диадический форматA⍕BФормат B в матрицу символов согласно АU + 2355
Общее транспонированиеA⍉BОси B заказаны АU + 2349
КомбинацииА! БКоличество комбинаций B взятый А вовремяU + 0021 !
Диэрезис, Дерезис, Двойная точкаA¨BНад каждым, или выполнять каждое отдельно; B = на них; А = операция для выполнения или использования (например, йота)U + 00A8 ¨
Меньше, чемА <ВСравнение: 1, если правда, 0, если ложьU + 003C <
Меньше или равноA≤BСравнение: 1, если правда, 0, если ложьU + 2264
РавныйА = ВСравнение: 1, если правда, 0, если ложьU + 003D =
Больше или равноA≥BСравнение: 1, если правда, 0, если ложьU + 2265
Лучше чемА> ВСравнение: 1, если правда, 0, если ложьU + 003E >
Не равныйА ≠ БСравнение: 1, если правда, 0, если ложьU + 2260
Или жеA∨BЛогическая логика: 0 (Ложь) если обе А и B = 0, 1 иначе. Alt: 1 (Верно) если А или же B = 1 (Истинный)U + 2228
ИA∧BЛогическая логика: 1 (Верно) если обе А и B = 1, 0 (Ложь) в противном случаеU + 2227
НиA⍱BЛогическая логика: 1, если оба А и B равны 0, иначе 0. Alt: ~ ∨ = not ИлиU + 2371
NandA⍲BЛогическая логика: 0, если оба А и B равны 1, иначе 1. Alt: ~ ∧ = not AndU + 2372
ОставилиA⊣BАU + 22A3
ПравильноA⊢BBU + 22A2

Операторы и индикатор оси

Имя (а)СимволПримерЗначение (примера)Последовательность кодовой точки Unicode
Уменьшить (последняя ось), косая черта/+ / BСумма по BU + 002F /
Уменьшить (первая ось)+ ⌿BСуммировать BU + 233F
Сканирование (последняя ось), обратная косая черта\+ BТекущая сумма по BU + 005C \
Сканирование (первая ось)+ ⍀BПодводя итоги BU + 2340
Внутренний продукт.А +. × ВМатричный продукт из А и BU + 002E .
Внешний продукт∘.A∘. × BВнешний продукт из А и BU + 2218 , U + 002E .

Примечания: Операторы сокращения и сканирования ожидают, что слева от них будет двоичная функция, образуя монадическую составную функцию, применяемую к вектору справа.

Оператор продукта "." ожидает диадическую функцию как слева, так и справа, образуя диадическую составную функцию, применяемую к векторам слева и справа. Если функция слева от точки - «∘» (обозначающая ноль), то составная функция является внешним продуктом, в противном случае - внутренним продуктом. Внутренний продукт, предназначенный для обычного умножения матриц, использует функции + и ×, замена их другими двоичными функциями может привести к полезным альтернативным операциям.

За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т.е. он появляется между функцией и массивом, и его не следует путать с индексами массива, написанными после массива. Например, учитывая функцию ⌽ (разворота) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:


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

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

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

Создание вложенного массива
Пользовательская сессия с интерпретатором APLОбъяснение
      Икс4 5⍴⍳20      Икс 1  2  3  4  5 6  7  8  9 1011 12 13 14 1516 17 18 19 20      Икс[2;2]7      ⎕IO1      Икс[1;1]1


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

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

Исходный происхождение индекса ⎕IO значение = 1.

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

      Икс[2;2]"Текст"      Икс[3;4](2 2⍴⍳4)      Икс  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) на вложенный вектор «Текст» с помощью заключить ⊂ функция.


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

С Икс содержит числа, текст и вложенные элементы, это одновременно смешанный и вложенный множество.

Визуальное представление вложенный массив

Управление потоком

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

Функции пользователя
Ниладский функция PI или π (pi)Монадический функция CIRCLEAREAДиадический функция SEGMENTAREA, с локальными переменными
  РЕЗУЛЬТАТЧИСЛО ПИ   РЕЗУЛЬТАТ1 
  ПЛОЩАДЬCIRCLEAREA РАДИУС   ПЛОЩАДЬЧИСЛО ПИ×РАДИУС2 
  ПЛОЩАДЬГРАДУСЫ СЕГМЕНТАЛЬНАЯ ЗОНА РАДИУС ; ДРОБНАЯ ЧАСТЬ ; CA   ДРОБНАЯ ЧАСТЬГРАДУСЫ÷360   CACIRCLEAREA РАДИУС   ПЛОЩАДЬДРОБНАЯ ЧАСТЬ×CA 

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

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

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

Следовательно, функция SEGMENTAREA может быть изменена на прерывание (чуть ниже), возвращая ноль, если параметры (ГРАДУСЫ и РАДИУС ниже) равны разные знак:

 ПЛОЩАДЬГРАДУСЫ СЕГМЕНТАЛЬНАЯ ЗОНА РАДИУС ; ДРОБНАЯ ЧАСТЬ ; CA ; ЗНАК     ⍝ локальные переменные, обозначаемые точкой с запятой (;)  ДРОБНАЯ ЧАСТЬГРАДУСЫ÷360  CACIRCLEAREA РАДИУС        ⍝ этот оператор кода APL вызывает пользовательскую функцию CIRCLEAREA, определенную выше.  ЗНАК(×ГРАДУСЫ)≠×РАДИУС     ⍝ << ПРОВЕРКА логики APL / определение, имеют ли ГРАДУСЫ и РАДИУС НЕ (используется ≠) один и тот же ЗНАК 1-да разные (≠), 0-нет (одинаковый знак)  ПЛОЩАДЬ0                      ⍝ значение по умолчанию для AREA установлено = ноль  ЗНАК/0                     ⍝ разветвление (здесь выход) происходит, когда SIGN = 1, а SIGN = 0 НЕ ведет к 0. Переход к 0 завершает функцию.  ПЛОЩАДЬДРОБНАЯ ЧАСТЬ×CA

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

        90 180 270 ¯90 ∘.СЕГМЕНТАЛЬНАЯ ЗОНА 1 ¯2 40 0 00 0 00 0 00 0 0

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

  ПЛОЩАДЬГРАДУСЫ СЕГМЕНТАЛЬНАЯ ЗОНА РАДИУС ; ДРОБНАЯ ЧАСТЬ ; CA ; ЗНАК   ДРОБНАЯ ЧАСТЬГРАДУСЫ÷360   CACIRCLEAREA РАДИУС   ЗНАК(×ГРАДУСЫ)≠×РАДИУС   ПЛОЩАДЬДРОБНАЯ ЧАСТЬ×CA×~ЗНАК  ⍝ этот оператор APL более сложен, поскольку он однострочный, но он решает векторизованные аргументы: компромисс - сложность или ветвление         90 180 270 ¯90 ∘.СЕГМЕНТАЛЬНАЯ ЗОНА 1 ¯2 40.785398163 0           12.56637061.57079633  0           25.13274122.35619449  0           37.69911180           ¯3.14159265 0

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

Разное

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

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

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

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

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

        ⎕IO0        Икс[1]2        Икс[0]1
Происхождение индекса ⎕IO теперь изменяется на 0. Таким образом, «первая позиция индекса» в векторе X изменяется с 1 на 0. Следовательно, X [1] затем ссылается или указывает на 2 с 1 2 3 4 5 ...} и X [0] теперь ссылки 1.
        ⎕WA41226371072
Quad WA или же ⎕WA, другая динамика системная переменная, показывает, сколько осталось рабочей области неиспользованный или 41226 мегабайты или около 41 гигабайты неиспользованных имеется дополнительная общая свободная рабочая зона для рабочего пространства APL и программы для обработки с помощью. Если это число становится низким или приближается к нулю - компьютеру может потребоваться больше оперативная память (БАРАН), привод жесткого диска пробел или их комбинация для увеличения виртуальная память.
        )VARSИкс
) VARS системная функция в APL,[15] ) VARS показывает имена пользовательских переменных, существующие в текущей рабочей области.

Также пользователям доступны системные функции для сохранения текущего рабочего пространства, например, )СПАСТИ и завершение среды APL, например, )ВЫКЛЮЧЕННЫЙ - иногда называют крюк команды или функции из-за использования ведущей правой круглой скобки или крючка.[16] Существует некоторая стандартизация этих функций квадроцикла и крюка.

Шрифты

Юникод Базовая многоязычная плоскость включает символы APL в Разное Техническое блокировать,[17] которые, таким образом, обычно точно отображаются из более крупных шрифтов Unicode, установленных в большинстве современных операционных систем. Эти шрифты редко разрабатываются типографами, знакомыми с глифами APL. Таким образом, несмотря на точность, глифы могут показаться незнакомыми программистам APL или их трудно отличить друг от друга.

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

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

Функция клавиатуры APL2 для отображения символов

Клавиатура APL2
Клавиатура APL2

Обратите внимание на кнопку включения / выключения APL - крайнюю правую верхнюю клавишу, чуть ниже. Также обратите внимание, что на клавиатуре было около 55 уникальных (68 перечисленных в таблицах выше, включая сравнительные символы, но несколько символов появляются в обе монадические и диадические таблицы) Символьные клавиши APL (55 функций (операторов) APL перечислены в Справочном руководстве IBM 5110 APL), таким образом, с использованием клавиш alt, shift и ctrl - теоретически можно было бы допустить максимум некоторых 59 (ключи) *4 (при нажатии 2-х клавиш) *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,¨¨а!¨а⌽⍳}   ⍝ Создайте однострочную пользовательскую функцию под названием 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 'Простые числа'  ⍝ Показать простые числа пользовательской функции APLПростые числаПростые числа N     ⍝ Функция принимает один правый аргумент N (например, показывает простые числа для 1 ... int N)Простые числа(2=+0=(N)∘.|⍳N)/N  ⍝ Однострочный текст Кена Айверсона      Простые числа 100    ⍝ Показать все простые числа от 1 до 1002 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97      Простые числа 10025                       ⍝ Всего двадцать пять простых чисел в диапазоне до 100.

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

      ⎕CR 'ProveNonPrime'ZProveNonPrime р⍝Показать все множители целого числа R, кроме 1 и самого числа,⍝ т.е. доказать непростое. Строка 'prime' возвращается для простого целого числа.Z(0=(р)|р)/р  ⍝ Определите все множители для целого числа R, сохраните в ZZ(~(Z1,р))/Z   ⍝ Удалите 1 и число как множители числа из Z.(0=⍴Z)/ProveNonPrimeIsPrime               ⍝ Если результат имеет нулевую форму, он не имеет других множителей и поэтому является простым.Zр,(«факторы (кроме 1)»),(Z),⎕TCNL  ⍝ Покажите число R, его множители (кроме самого 1) и символ новой строки0  ⍝ Выполнено с функцией, если не простое числоProveNonPrimeIsPrime: Zр,(" основной"),⎕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 "Фибоначчи"              ⍝ Функция отображения ФибоначчиFibonacciNumФибоначчи Nth;IOwas   ⍝ Заголовок функции, имя функции = Фибоначчи, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число.⍝Создайте упорядоченное число Фибоначчи, где N-й - номер позиции числа Фибоначчи в последовательности. << описание функцииIOwas⎕IO  ⎕IO0  FibonacciNum0 1↓↑+.×/Nth/2 21 1 1 0  ⎕IOIOwas   ⍝ Чтобы эта функция работала правильно, ⎕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 в подробностях (серия Springer в статистике) (Мягкая обложка) (Перепечатка оригинала 1-го изд.). Springer. ISBN  978-0387942131.
  • Гилман, Леонард; Роуз, Аллен Дж. (1976). А. П. Л .: Интерактивный подход (Мягкая обложка) (3-е изд.). ISBN  978-0471093046.

Смотрите также

Рекомендации

  1. ^ Айверсон, Кеннет Э. (1962-01-01). «Язык программирования». Материалы весенней совместной компьютерной конференции 1–3 мая 1962 г.. AIEE-IRE '62 (весна). Нью-Йорк, Нью-Йорк, США: ACM: 345–351. Дои:10.1145/1460833.1460872.
  2. ^ Баронет, Дан. «Операторы Sharp APL». archive.vector.org.uk. Фото со стока - Журнал Британской ассоциации APL. Получено 13 января 2015.
  3. ^ MicroAPL. «Примитивные операторы». www.microapl.co.uk. MicroAPL. Получено 13 января 2015.
  4. ^ MicroAPL. «Операторы». www.microapl.co.uk. MicroAPL. Получено 13 января 2015.
  5. ^ Прогопедия. «АПЛ». progopedia.com. Прогопедия. Получено 13 января 2015.
  6. ^ Дьялог. «D-функции и операторы, свободно сгруппированные по категориям». dfns.dyalog.com. Дьялог. Получено 13 января 2015.
  7. ^ IBM. "Справочное руководство IBM 5100 APL" (PDF). bitsavers.trailing-edge.com. IBM. Архивировано из оригинал (PDF) 14 января 2015 г.. Получено 14 января 2015.
  8. ^ Браун, Джим (1978). «В защиту происхождения индекса 0». ACM SIGAPL APL Quote Quad. 9 (2): 7. Дои:10.1145/586050.586053.
  9. ^ MicroAPL. "Руководство по языку APLX" (PDF). www.microapl.co.uk. MicroAPL - версия 5. 0 июня 2009 г. с. 22. Получено 31 января 2015.
  10. ^ Бенкард, Дж. Филип (1992). «Вложенные массивы и операторы: некоторые проблемы в глубине». ACM SIGAPL APL Quote Quad. 23 (1): 7–21. Дои:10.1145/144045.144065. ISBN  978-0897914772.
  11. ^ Берри, Пол "APL 360 Primer Student Text", IBM Research, Исследовательский центр Томаса Дж. Ватсона, 1969.
  12. ^ "Научный труд" (PDF). www.cs.utexas.edu. Получено 2019-09-10.
  13. ^ Кейсон, Стэн. "Библиотека идиом APL2". www-01.ibm.com. IBM. Получено 1 февраля 2015.
  14. ^ «Высокий минус» APL применяется к единственному последующему числу, в то время как монадическая функция «минус» изменяет знак всего массива справа от него.
  15. ^ «Рабочее пространство - Системные функции». Microapl.co.uk. п. (в нижней части веб-страницы). Получено 2018-11-05.
  16. ^ "Справочник по языку APL" (PDF). Получено 2018-11-05.
  17. ^ Диаграмма Unicode «Разное техническое (включая APL)» (PDF).

внешняя ссылка

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

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