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 — более богатую среду; синтаксис базовых примитивов переносится между ними, а вот системные функции и ввод-вывод придётся уточнять по документации. Для тренировки перепишите небольшую задачу из своего проекта и сравните число строк.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте