APL появился в 1960-х как нотация для описания алгоритмов и со временем стал языком с уникальным взглядом на данные: операция применяется ко всему массиву целиком, а не к отдельным элементам. В 2026 году APL живёт в двух основных реализациях — проприетарной Dyalog и свободной GNU APL, — и остаётся отличным тренажёром массивного мышления. Ниже — практическое введение: установка, векторы, матрицы, функции, скрипты и грабли, на которые наступают почти все новички.
Установка и среда
Для экспериментов достаточно GNU APL из репозитория. В Debian и Ubuntu пакет называется apl. Dyalog бесплатен для некоммерческого использования, но требует регистрации и отдельной установки; для первых шагов он не обязателен.
sudo apt install apl
apl --version
Запустите интерпретатор командой apl. Вы увидите приглашение; строки с выражением выполняются сразу, результат печатается под строкой. Выход — )OFF. Команда )HELP показывает список системных команд, а )VARS и )FNS — объявленные переменные и функции.
Для ввода символов нужна раскладка APL. В X11 подойдёт макет apl из XKB; в Wayland раскладка выбирается средствами рабочего стола. Dyalog поддерживает ввод через обратную кавычку: нажмите её, затем клавишу с латинской буквой, и получите соответствующий глиф. Шрифт должен содержать знаки APL — иначе вместо ⍳ и ⌽ будут квадраты.
Вектор — базовая единица
В APL нет отдельного «скаляра» и «списка»: число — это массив с нулевой размерностью, вектор — с одной. Функция ⍳ создаёт последовательность, ⍴ — массив заданной формы, ≢ — длину.
⍳5
2 3⍴⍳6
≢2 3⍴⍳6
⍴2 3⍴⍳6
Результат 2 3⍴⍳6 — матрица из двух строк и трёх столбцов, заполненная числами от 1 до 6 по строкам. Обратите внимание: ⍴ слева от данных — reshape, а справа — shape. Один символ, две роли, контекст решает всё.
Арифметика работает поэлементно: 1 2 3 + 10 даст 11 12 13. Сравнения тоже возвращают массивы нулей и единиц, а / с логическим вектором слева фильтрует данные.
1 2 3 + 10
1 0 1 / 10 20 30
+/⍳100
+\⍳10
+/ — редукция сложением, +\ — сканирование, то есть накопленные суммы. Именно эти две операции чаще всего заменяют циклы в прикладном коде.
Чтение справа налево
В APL нет приоритетов операций: выражение вычисляется справа налево. Это сначала шокирует, потом экономит скобки. 2×3+4 равно 14, а не 10. Если нужен другой порядок, ставьте скобки.
2×3+4
(2×3)+4
2×(3+4)
Отрицательные числа записываются знаком ¯, а не дефисом: ¯3. Дефис остаётся минусом. Эта мелочь экономит массу ошибок при копировании формул из текста.
Функции и операторы
Пользовательская функция задаётся фигурными скобками и называется dfn, то есть direct function. ⍵ — правый аргумент, ⍺ — левый, ∇ — рекурсия.
square←{⍵*2}
square 1 2 3 4
add←{⍺+⍵}
2 add 3
square¨⍳5
¨ применяет функцию к каждому элементу. Для внешнего произведения используется ∘.×: получается таблица всех пар произведений.
(⍳3)∘.×⍳4
⌽⍳5
⍋3 1 2
∪1 2 2 3 1
⌽ переворачивает вектор, ⍋ возвращает индексы для сортировки по возрастанию, ∪ убирает повторы. Сортировка самого массива — это v[⍋v]: сначала индексы, затем индексация.
Матрицы и внутреннее произведение
Матричное умножение в APL записывается как +.× — комбинация «сложение» и «умножение». Это не отдельная функция, а обобщённое внутреннее произведение: вместо + и × можно подставить другие операции.
A←2 3⍴⍳6
B←3 2⍴⍳6
A+.×B
⍉A
⍉ транспонирует матрицу. Проверьте размерности: у A форма 2×3, у B — 3×2, результат — 2×2. APL не спасает от ошибок согласования размеров, но сообщение о несовпадении форм обычно точнее, чем в языках с неявным вещанием.
Практика: нормализация и текст
Типовая задача — привести набор чисел к диапазону от нуля до единицы. В императивном языке для этого нужен цикл или библиотека; в APL достаточно одной строки.
x←3 5 8 13 21
(x-⌊/x)÷(⌈/x)-⌊/x
(+/x)÷≢x
Выражение читается справа налево, но скобки делают намерение явным: вычитаем минимум, делим на размах. Пустой вектор — особый случай: проверяйте 0=≢x до вычисления.
Подсчёт слов в строке тоже показателен. Сравнение строки с пробелом даёт логический вектор, сумма которого равна числу пробелов.
text←'array programming in apl'
+/' '=text
1++/' '=text
Для реального файла прочитайте его через ⎕FIO или передайте содержимое как строку. GNU APL поддерживает системные функции ввода-вывода, но их имена стоит сверять с документацией конкретной версии: между реализациями здесь больше различий, чем в базовых примитивах.
Скрипты
Код можно сохранить в файл и запустить без интерактивного режима. Shebang указывает интерпретатор, а --script отключает интерактивный режим.
#!/usr/bin/apl --script
⍝ report.apl
values←⍳10
⎕←'Сумма:' (+/values)
)OFF
Запуск: apl --script report.apl. Строка ⍝ — комментарий. Для отладки полезно печатать промежуточные значения через ⎕←, а не полагаться на пошаговый режим: он в GNU APL скромнее, чем в Dyalog.
Грабли
- Индексная база. По умолчанию
⎕IO←1. Код из примеров для нулевой базы нужно адаптировать или явно поставить⎕IO←0. - Толерантное сравнение.
⎕CTзадаёт допуск; числа, различающиеся в младших разрядах, могут считаться равными. Для точных проверок ставьте⎕CT←0. - Форматирование.
⍕превращает число в строку с учётом⎕PP; не сравнивайте числа со строками. - Пустые массивы.
⍳0— легальное значение; редукция по пустому вектору возвращает нейтральный элемент, а не ошибку. - Копирование глифов. Следите за тем, чтобы в редакторе была UTF-8 и не подменялись похожие символы.
Итог
APL стоит изучать не ради экзотики, а ради смены оптики: вы начинаете видеть в данных массивы и операции над ними, а циклы уходят на второй план. Начните с ⍳, ⍴, +/ и ¨, затем перепишите одну знакомую задачу без циклов. GNU APL даёт бесплатную площадку, Dyalog — более богатую среду; синтаксис базовых примитивов переносится между ними, а вот системные функции и ввод-вывод придётся уточнять по документации. Для тренировки перепишите небольшую задачу из своего проекта и сравните число строк.