Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

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


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

Правила синтаксиса [ править ]

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

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


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

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



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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

  ОБЛАСТЬ РАДИУС СЕГМЕНТАЛЬНОЙ ЗОНЫ ГРАДУСОВ  ; ФРАКЦИЯ ; CA ; ЗНАК ФРАКЦИИ Degrees ÷ 360 CA CIRCLEAREA RADIUS SIGN ( × ГРАДУСОВ ) ≠ × RADIUS AREA ФРАКЦИИ × CA × ~ SIGN ⍝ это APL утверждение является более сложным, как однострочника - но он решает векторизованную аргументы: компромисс - сложность против ветвления                90  180  270  ¯90  ∘. СЕГМЕНТАЛЬНАЯ ЗОНА  1  ¯2  4 0,785398163  0  12,5663706 1,57079633  0  25,1327412 2,35619449  0  37,6991118 0  ¯3,14159265  0

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

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

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

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

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

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

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

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

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

Клавиатура APL2

Обратите внимание на кнопку включения / выключения APL - крайнюю правую верхнюю клавишу, чуть ниже. Также обратите внимание, что на клавиатуре было около 55 уникальных (68 перечисленных в таблицах выше, включая сравнительные символы, но несколько символов появляются как в монадических, так и в диадических таблицах) символьных клавиш APL (55 функций (операторов) APL перечислены в Справочном руководстве IBM 5110 APL), таким образом с использованием клавиш alt, shift и ctrl - теоретически можно было бы разрешить максимум около 59 (клавиш) * 4 (при нажатии двух клавиш) * 3 (при нажатии трех клавиш, например, ctrl-alt-del) или около 472 различных максимальных комбинаций клавиш, приближающихся к 512 EBCDICмаксимум символов (256 символов умноженное на 2 кода для каждой комбинации клавиш). Опять же, теоретически клавиатура, изображенная ниже, позволяла бы активно использовать около 472 различных символов / функций APL для ввода с клавиатуры. На практике в ранних версиях использовалось только что-то примерно эквивалентное 55 специальным символам APL (исключая буквы, цифры, знаки пунктуации и т. Д.). Таким образом, ранний APL тогда использовал только около 11% (55/472) потенциала использования символьного языка на тот момент, исходя из ограничений на количество клавиш на клавиатуре, снова исключая числа, буквы, знаки препинания и т. Д. В другом смысле символы клавиатуры использование было ближе к 100%, что очень эффективно, поскольку EBCDIC допускал только 256 различных символов, а ASCII - только 128.

Решение головоломок [ править ]

APL оказался чрезвычайно полезным при решении математических задач, некоторые из которых описаны ниже.

Треугольник Паскаля [ править ]

Возьмем треугольник Паскаля , который представляет собой треугольный массив чисел, в котором числа на концах строк равны 1, а каждое из других чисел является суммой ближайших двух чисел в строке непосредственно над ним (вершина, 1, находится на вершина). Ниже приведена однострочная функция APL для визуального изображения треугольника Паскаля:

 Паскаль { 0 ~ ¨⍨ a ⌽⊃⌽∊ ¨ 0 , ¨¨ a ! ¨ a ⌽⍳ }  ⍝ Создайте однострочную пользовательскую функцию под названием Pascal  Pascal  7  ⍝ Запустите функцию Pascal для семи строк и покажите результаты ниже:  1  1  2  1  3  3  1  4  6  4  1  5  10  10  5  1  6  15  20  15  6  1  7  21  35  35  21 7

Простые числа, противопоказано доказательство с помощью факторов [ править ]

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

 ⎕CR  'PrimeNumbers'  ⍝ Показать пользовательскую функцию APL PrimeNumbers Primes PrimeNumbers  N  ⍝ Функция принимает один правый аргумент N (например, показывает простые числа для 1 ... int N) Простые числа ( 2 = + 0 = ( N ) ∘. | ⍳ Н ) / N  ⍝ Кен Айверсон один вкладыш  PrimeNumbers  100  ⍝ Показать все простые числа от 1 до 100 2  3  5  7  11  13  17  19  23  29  31  37  41 43  47  53  59  61  67  71  73  79  83  89  97  Простые числа  100 25  ⍝ Всего двадцать пять простых чисел в диапазоне до 100.

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

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

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

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

 ⎕CR  'Fibonacci'  ⍝ Функция отображения Fibonacci FibonacciNum Fibonacci  Nth ; IOwas  ⍝ Заголовок функции, имя функции = Фибоначчи, монадическая функция с 1 правым аргументом Nth; локальная переменная IOwas и возвращаемое число. ⍝Создайте упорядоченное число Фибоначчи, где N-й - номер позиции числа Фибоначчи в последовательности. << описание функции IOwas ⎕IO   ⎕IO 0   FibonacciNum 0  1 ↓ ↑ + . × / Nth / 2  2 1  1  1 0   ⎕IO IOwas  ⍝ Для того, чтобы эта функция работала правильно, ⎕IO необходимо установить в ноль. Фибоначчи ¨ 14  ⍝ В этом заявлении APL говорится: сгенерируйте последовательность Фибоначчи по каждому (¨) целому числу (йота или) для целых чисел 1..14. 0  1  1  2  3  5  8  13  21  34  55  89  144  233  ⍝ Сгенерированная последовательность, то есть последовательность чисел Фибоначчи, сгенерированная интерпретатором APL.

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

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

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

  • Разное техническое - блок Unicode, включая ключи APL
  • APL (кодовая страница) § Раскладка клавиатуры - более современная информация о раскладке клавиатуры APL

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

  1. ^ Айверсон, Кеннет Э. (1962-01-01). «Язык программирования». Труды 1-3 мая 1962 года, весна Joint Computer конференции . AIEE-IRE '62 (весна). Нью-Йорк, Нью-Йорк, США: ACM: 345–351. DOI : 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. Архивировано 14 января 2015 года из оригинального (PDF) . Проверено 14 января 2015 года .
  8. ^ Браун, Джим (1978). «В защиту происхождения индекса 0». ACM SIGAPL APL Quote Quad . 9 (2): 7. DOI : 10,1145 / 586050,586053 .
  9. ^ MicroAPL. «Руководство по языку APLX» (PDF) . www.microapl.co.uk . MicroAPL - версия 5. 0 июня 2009 г. с. 22 . Проверено 31 января 2015 года .
  10. ^ Benkard, J. Philip (1992). «Вложенные массивы и операторы: некоторые проблемы в глубине». ACM SIGAPL APL Quote Quad . 23 (1): 7–21. DOI : 10.1145 / 144045.144065 . ISBN 978-0897914772.
  11. ^ Берри, Пол "APL \ 360 Primer Student Text" , IBM Research, Исследовательский центр Томаса Дж. Уотсона, 1969.
  12. ^ «Трактат» (PDF) . www.cs.utexas.edu . Проверено 10 сентября 2019 .
  13. ^ Кейсон, Стэн. «Библиотека идиом APL2» . www-01.ibm.com . IBM . Проверено 1 февраля 2015 года .
  14. ^ APL "высокий минус" применяется к единственному последующему числу, в то время как монадическая функция минус изменяет знак всего массива вправо.
  15. ^ «Рабочая область - Системные функции» . Microapl.co.uk. п. (в нижней части веб-страницы) . Проверено 5 ноября 2018 .
  16. ^ "Справочник по языку APL" (PDF) . Проверено 5 ноября 2018 .
  17. ^ Таблица Unicode «Разное техническое (включая APL)» (PDF) .

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

  • Ссылка на символы APL: страница 1 , страница 2 , страница 3 , страница 4
  • Страница шрифтов Британской ассоциации APL
  • Кодовая страница IBM 293, также известная как кодовая страница APL на мэйнфреймах
  • Общая информация о APL-символах в APL wiki
  • расширение APL и его символы-операторы клавиатуры.
  • Ли, Ха. «Как создать раскладку клавиатуры APL или математических символов» . Проверено 13 января 2015 года .

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

  • Практическое введение в APL 1 и APL 2 Грэм Дональд Робертсон
  • APL для ПК, серверов и планшетов - полнофункциональный NARS , без ограничений, бесплатно загружаемый APL / 2 с вложенными массивами от Sudley Place Software
  • Бесплатно загружаемый интерпретатор GNU APL для APL от Юргена Зауэрмана
  • YouTube APL Tutorials, загруженные Чимином Паком, 8 вводных / обучающих видео для начинающих.
  • Список скомпилированных руководств SIGAPL
  • Learn APL: Учебное пособие по APL от MicroAPL

Правила синтаксиса [ править ]

  • Игра Конвея в жизни в APL, на YouTube
  • Айверсон, Кеннет Э. (1983). «Синтаксис и семантика APL» . ACM SIGAPL APL Quote Quad . 13 (3): 223–231. DOI : 10.1145 / 800062.801221 . ISBN 978-0897910958.
  • Гффер, М. (1989). «Будущее APL: примеры и проблемы» . ACM SIGAPL APL Quote Quad . 19 (4): 158–163. DOI : 10.1145 / 75144.75166 . ISBN 978-0897913270.