Jump to content

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

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

Монадические и диадические функции [ править ]

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

Функции и операторы [ править ]

APL использует термин «оператор» в смысле Хевисайда как модератор функции, в отличие от того, как некоторые другие языки программирования используют тот же термин в качестве чего-то, что работает с данными, см. реляционный оператор и операторы вообще . Другие языки программирования также иногда используют этот термин как синоним функции , однако в APL оба термина используются более точно. [2] [3] [4] [5] [6] Ранние определения символов APL были очень конкретными в отношении их классификации. [7] Например, оператор сокращения обозначается косой чертой и уменьшает массив по одной оси, вставив свой функциональный операнд . Пример сокращения :

      ×/2 3 4
24
<< Эквивалентные результаты в APL >>
<< сокращения Оператор / используется слева
      2×3×4
24

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


      1 0 1\45 67
45 0 67
<< Противоположные результаты в APL >>
<< Развернуть двоичную функцию \ используется слева
Реплицировать диадическую функцию / используется справа >>
      1 0 1/45 0 67
45 67

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

Синтаксические правила [ править ]

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

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


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

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



Монадические функции [ править ]

Имя(а) Обозначения Значение Кодовая точка Юникода
Рулон ?B Одно целое число, выбранное случайным образом из первых B целых чисел U+003F ? ЗНАК ВОПРОСА
Потолок ⌈B Наименьшее целое число, большее или равное B U + 2308 ЛЕВЫЙ ПОТОЛОК
Пол ⌊B Наибольшее целое число, меньшее или равное B U+230A ЛЕВЫЙ ЭТАЖ
Форма, Ро ⍴B Количество компонентов в каждом измерении B U + 2374 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL RHO
Нет , Тильда ∼B Логично: ∼1 — 0, ∼0 — 1. U + 223C ОПЕРАТОР ТИЛЬДА
Абсолютное значение ∣B Величина B U + 2223 РАЗДЕЛЯЕТ
Генератор индексов, Йота ⍳B Вектор первых B целых чисел U + 2373 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL IOTA
Экспоненциальный ⋆B е в B степени U + 22C6 ЗВЕЗДНЫЙ ОПЕРАТОР
Отрицание −B Меняет знак B U + 2212 ЗНАК МИНУС
Сопряженный +B Комплексно-сопряженное число B (действительные числа возвращаются без изменений) U + 002B + ЗНАК ПЛЮС
Знак ×B ¯1, если B <0; 0, если В =0; 1, если B >0 U + 00D7 × ЗНАК УМНОЖЕНИЯ
Взаимный ÷B 1 разделить на Б U+00F7 ÷ ЗНАК РАЗДЕЛЕНИЯ
Равель, Катенат, Ламинат ,B Преобразует B в вектор U+002C , ЗАПЯТАЯ
Обратная матрица , монадическое деление на квадрики ⌹B Обратная матрица B U + 2339 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL QUAD DIVIDE
Пи времена ○B Умножить на π U+25CB БЕЛЫЙ КРУГ
Логарифм ⍟B Натуральный логарифм B U + 235F ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL КРУГ ЗВЕЗДА
Разворот ⌽B Поменяйте местами элементы B вдоль последней оси. U + 233D ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL, СТИЛЬ КРУГА
Разворот ⊖B Поменяйте местами элементы B вдоль первой оси. U + 2296 ОБВЕДЕННЫЙ МИНУС
Повышение класса ⍋B Индексы B, которые расположит B в порядке возрастания. U + 234B ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ДЕЛЬТА-СТИЛЬ
Понизить оценку ⍒B Индексы B, которые расположит B в порядке убывания. U + 2352 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL DEL STILE
Выполнять ⍎B Выполнить APL выражение U + 234E ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ВНИЗ.
Монадический формат ⍕B Представление персонажа B U + 2355 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL UP TACK JOT
Монадическое транспонирование ⍉B Поменяйте местами оси B. U + 2349 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL, обратная косая черта в круге
Факториал !B Произведение целых чисел от 1 до B У+0021 ! ВОСКЛИЦАТЕЛЬНЫЙ ЗНАК
Глубина ≡B Глубина вложенности: 1 для невложенного массива. U + 2261 ИДЕНТИЧЕН
Стол ⍪B Превращает B в таблицу, двумерный массив. U + 236A ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL ЗАПЯТАЯ

Диадические функции [ править ]

Имя(а) Обозначения Значение Юникод
кодовая точка
Добавлять A+B Сумма А и Б U + 002B + ЗНАК ПЛЮС
Вычесть A−B А минус Б U + 2212 ЗНАК МИНУС
Умножить A×B А, умноженное на Б U + 00D7 × ЗНАК УМНОЖЕНИЯ
Разделять A÷B А разделить на Б U+00F7 ÷ ЗНАК РАЗДЕЛЕНИЯ
Возведение в степень A⋆B A возведен в B степень U + 22C6 ЗВЕЗДНЫЙ ОПЕРАТОР
Круг A○B Тригонометрические функции B , выбранные A
A=1: sin(B)    A=5: sinh(B)
A=2: cos(B)    A=6: cosh(B)
A=3: tan(B)    A=7: tanh(B)

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

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

Операторы и индикатор оси [ править ]

Имя(а) Символ Пример Значение (пример) Последовательность кодовых точек Юникода
Уменьшить (последняя ось), Слэш / +/B Сумма по B U + 002F / СОЛИДУС
Уменьшить (первая ось) +⌿B Суммируем Б U + 233F ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL. КРАСНАЯ ПОЛОСКА
Сканирование (последняя ось), обратная косая черта \ +\B Текущая сумма по B U+005C \ ОБРАТНЫЙ СОЛИДУС
Сканирование (первая ось) +⍀B Проведение суммы вниз B U + 2340 ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL обратная косая черта
Внутренний продукт . A+.×B Матричное произведение A и B U + 002E . ПОЛНАЯ СТОП
Внешний продукт ∘. A∘.×B Внешний продукт A и B U+2218 КОЛЬЦО ОПЕРАТОР , U + 002E . ПОЛНАЯ СТОП

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

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

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


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

Вложенные массивы [ править ]

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

Создание вложенного массива
Сеанс пользователя с интерпретатором APL Объяснение
      X4 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 set = матрица с 4 строками и 5 столбцами, состоящая из 20 последовательных целых чисел.

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

Начальное происхождение индекса ⎕IO value = 1 .

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

      X[2;2]"Text"
      X[3;4](2 2⍴⍳4)
      X
  1    2  3      4    5
  6 Text  8      9   10

 11   12 13    1 2   15
               3 4

 16   17 18     19   20
Элемент в X[строка 2; col 2] заменяется (с 7) на вложенный вектор «Текст» с помощью функции включения ⊂ .


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

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

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

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

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

Пользовательские функции
Ниладическая функция PI или π(pi) Монадическая функция CIRCLEAREA Диадическая функция SEGMENTAREA с локальными переменными
  RESULTPI
   RESULT1
 
  AREACIRCLEAREA RADIUS
   AREAPI×RADIUS2
 
  AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA
   FRACTIONDEGREES÷360
   CACIRCLEAREA RADIUS
   AREAFRACTION×CA
 

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

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

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

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

 AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN     ⍝ local variables denoted by semicolon(;)
  FRACTIONDEGREES÷360
  CACIRCLEAREA RADIUS        ⍝ this APL code statement calls user function CIRCLEAREA, defined up above.
  SIGN(×DEGREES)≠×RADIUS     ⍝ << APL logic TEST/determine whether DEGREES and RADIUS do NOT (≠ used) have same SIGN 1-yes different(≠), 0-no(same sign)
  AREA0                      ⍝ 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.
  AREAFRACTION×CA

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

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

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

  AREADEGREES SEGMENTAREA RADIUS ; FRACTION ; CA ; SIGN
   FRACTIONDEGREES÷360
   CACIRCLEAREA RADIUS
   SIGN(×DEGREES)≠×RADIUS
   AREAFRACTION×CA×~SIGN  ⍝ this APL statement is more complex, as a one-liner - but it solves vectorized arguments: a tradeoff - complexity vs. branching
 

        90 180 270 ¯90 ∘.SEGMENTAREA 1 ¯2 4
0.785398163 0           12.5663706
1.57079633  0           25.1327412
2.35619449  0           37.6991118
0           ¯3.14159265 0

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

Разное [ править ]

Разные символы
Имя(а) Символ Пример Значение (пример) Кодовая точка Юникода
Высокий минус [14] ¯ ¯3 Обозначает отрицательное число U+00AF ¯ МАКРОН
Лампа, Комментарий ⍝This is a comment Все, что справа от ⍝, обозначает комментарий. U + 235D ФУНКЦИОНАЛЬНЫЙ СИМВОЛ APL UP SHOE JOT
Стрелка вправо, Ветка, Перейти →This_Label →This_Label отправляет выполнение APL на This_Label: U + 2192 СТРЕЛКА ВПРАВО
Назначить, Стрелка влево, Установить на B←A B ←A устанавливает значения и форму B в соответствии с A. U + 2190 СТРЕЛКА ВЛЕВО

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

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

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

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

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

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

Шрифты [ править ]

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

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

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

Функция клавиатуры APL2 для сопоставления символов [ править ]

Клавиатура 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 для визуального изображения треугольника Паскаля:

      Pascal{0~¨⍨a⌽⊃⌽∊¨0,¨¨a!¨a⌽⍳}   ⍝ Create one-line user function called Pascal
      Pascal 7                            ⍝ Run function Pascal for seven rows and show the results below:
                     1                       
                 1       2                   
             1       3       3               
          1      4       6       4           
       1     5       10      10      5       
    1     6      15      20      15      6   
 1     7     21      35      35      21     7

Простые числа, доказательство обратного множителей помощью с

Определите количество простых чисел (простое # — натуральное число больше 1 , не имеющее положительных делителей, кроме 1 и самого себя) до некоторого числа N. Кену Айверсону приписывают следующее однострочное решение APL проблемы:

      ⎕CR 'PrimeNumbers'  ⍝ Show APL user-function PrimeNumbers
PrimesPrimeNumbers N     ⍝ Function takes one right arg N (e.g., show prime numbers for 1 ... int N)
Primes(2=+0=(N)∘.|⍳N)/N  ⍝ The Ken Iverson one-liner
      PrimeNumbers 100    ⍝ Show all prime numbers from 1 to 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
      PrimeNumbers 100
25                       ⍝ There are twenty-five prime numbers in the range up to 100.

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

      ⎕CR 'ProveNonPrime'
ZProveNonPrime R
⍝Show all factors of an integer R - except 1 and the number itself,
⍝ i.e., prove Non-Prime. String 'prime' is returned for a Prime integer.
Z(0=(R)|R)/R  ⍝ Determine all factors for integer R, store into Z
Z(~(Z1,R))/Z   ⍝ Delete 1 and the number as factors for the number from Z.
(0=⍴Z)/ProveNonPrimeIsPrime               ⍝ If result has zero shape, it has no other factors and is therefore prime
ZR,(" factors(except 1) "),(Z),⎕TCNL  ⍝ Show the number R, its factors(except 1,itself), and a new line char
0  ⍝ Done with function if non-prime
ProveNonPrimeIsPrime: ZR,(" prime"),⎕TCNL  ⍝ function branches here if number was prime

      ProveNonPrime ¨15      ⍝ Prove non primes for each(¨) of the integers from 1 through 15 (iota 15)
    1  prime
    2  prime
    3  prime
    4  factors(except 1)   2 
    5  prime
    6  factors(except 1)   2 3 
    7  prime
    8  factors(except 1)   2 4 
    9  factors(except 1)   3 
    10  factors(except 1)   2 5 
    11  prime
    12  factors(except 1)   2 3 4 6 
    13  prime
    14  factors(except 1)   2 7 
    15  factors(except 1)   3 5

Последовательность Фибоначчи [ править ]

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

      ⎕CR 'Fibonacci'              ⍝ Display function Fibonacci
FibonacciNumFibonacci Nth;IOwas   ⍝ Funct header, funct name=Fibonacci, monadic funct with 1 right hand arg Nth;local var IOwas, and a returned num.
⍝Generate a Fibonacci sequenced number where Nth is the position # of the Fibonacci number in the sequence.  << function description
IOwas⎕IO  ⎕IO0  FibonacciNum0 1↓↑+.×/Nth/2 21 1 1 0  ⎕IOIOwas   ⍝ In order for this function to work correctly ⎕IO must be set to zero.

      Fibonacci¨14    ⍝ This APL statement says: Generate the Fibonacci sequence over each(¨) integer number(iota or ⍳) for the integers 1..14.
0 1 1 2 3 5 8 13 21 34 55 89 144 233   ⍝ Generated sequence, i.e., the Fibonacci sequence of numbers generated by APL's interpreter.

Дальнейшее чтение [ править ]

  • Поливка, Раймонд П.; Пакин, Сандра (1975). APL: язык и его использование . Прентис-Холл. ISBN  978-0-13-038885-8 .
  • Рейтер, Клиффорд А.; Джонс, Уильям Р. (1990). APL с математическим акцентом (1-е изд.). Тейлор и Фрэнсис. ISBN  978-0534128647 .
  • Томпсон, Норман Д.; Поливка, Раймонд П. (2013). APL2 в глубине (Серия Springer по статистике) (Мягкая обложка) (Перепечатка оригинального 1-го изд.). Спрингер. ISBN  978-0387942131 .
  • Гилман, Леонард; Роуз, Аллен Дж. (1976). APL: Интерактивный подход (Мягкая обложка) (3-е изд.). Уайли. ISBN  978-0471093046 .

См. также [ править ]

Ссылки [ править ]

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

Внешние ссылки [ править ]

Общие онлайн-уроки [ править ]

Синтаксические правила [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 61f2a5efc8585e1e1b9cefeede0c9b1b__1702472820
URL1:https://arc.ask3.ru/arc/aa/61/1b/61f2a5efc8585e1e1b9cefeede0c9b1b.html
Заголовок, (Title) документа по адресу, URL1:
APL syntax and symbols - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)