APL é uma linguagem de programação destinada a operações matemáticas.

Ela nasceu do trabalho do professor de matemática canadense Kenneth Iverson. A linguagem APL foi formalmente definida e introduzida por Iverson em seu livro A Programming Language, de 1962. Sua proposta original era a de produzir uma nova notação matemática, menos sujeita às ambiguidades da notação convencional. Segundo Iverson, foi projetada com o objetivo de ser matematicamente concisa, simples, precisa e executável.

Na década de 1960, trabalhando na IBM em conjunto com Adin Falkoff, ambos produziram a primeira versão de APL, de 1966, quando um interpretador da linguagem ficou disponível. HUI, Roger, ed. (September 2010), APL Quotations and Anecdotes.«The workspace "1 cleanspace" was saved at 1966-11-27 22.53.58 UTC.»

APL tem diversos dialetos, mas há uma versão internacional padronizada pela ISO/IEC 13751:2001. ISO/IEC 13751:2001 Information technology -- Programming languages, their environments and system software interfaces -- Programming language Extended APL. Outra referência importante é APL2 Programming: Language Reference, da IBM. IBM APL2 Programming: Language Reference.

O Conjunto de Caracteres APL

Uma das principais características de APL é o uso de um conjunto especial de caracteres que incluem algumas letras gregas (⍴ − rho, ⍳ − iota…), símbolos matemáticos convencionais (o sinal × de vezes, o ÷ de dividido…) e alguns símbolos especialmente inventados (como ⍋ e ⍟). Este fato sempre limitou a disseminação da linguagem. Até o advento das interfaces gráficas (Windows, por exemplo), exigia-se um hardware especial para programar em APL.

A linguagem APL recebeu muitas críticas pelo fato de usar este conjunto de caracteres não padronizado. Tal número de caracteres adicionais pode levar a um grau de complexidade alto resultando em uma baixa legibilidade. Por outro lado, o conjunto adicional de caracteres dá a linguagem uma elegância e a tornam concisa, o que é mais difícil de se conseguir em linguagens com um conjunto de caracteres reduzido.

A dificuldade criada pelos caracteres especiais de APL foi um dos motivos para que, ao conceber a linguagem J no início dos anos 1990, Kenneth E. Iverson (criador de APL), decidisse nela usar apenas caracteres convencionais ASCII. K.E. Iverson. A Personal View of APL.

Este (abaixo) é um subconjunto da lista de caracteres APL usados pelo interpretador GNU APL, gerado pelo comando ,¨7 32⍴32↓⎕AV .

␠ ! " ♯ $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ␡ ¥ € ⇄ ∧ ∼ ≬ ⋆ ⋸ ⌸ ⌺ ⌼ μ ⍁ ¡ ⍣ ⍅ ⎕ ⍞ ⌹ ⍆ ⍤ ⍇ ⍈ ⍊ ⊤ λ ⍍ ⍏ £ ⊥ ⍶ ⌶ ⍐ ⍑ χ ≢ ⍖ ⍗ ⍘ ⍚ ⍛ ⌈ ⍜ ⍢ ∪ ⍨ ⍕ ⍎ ⍬ ⍪ ∣ │ </small> ⍟ ∆ ∇ → ╣ --> ← ⌊ == Galeria de imagens == ] ─

↑ ↓ <!-- ╩ ╦ ⍺ ⍹ ⊂ ⊃ ⍝ ⍲ ⍴ ⍱ ⌽ ⊖ ○ ∨ ⍳ ⍉ ∈ ∩ ⌿ ⍀ ≥ ≤ ≠ × ÷ ⍙ ∘ ⍵ ⍫ ⍋ ⍒ ¯ ¨ ␚

Unicode e fontes O padrão Unicode contém os símbolos especiais de APL (pontos de código U+2336 a U+237A e U+2395) no bloco Miscellaneous Technical. Unicode − Miscellaneous Technical. FileFormat.info − Font Support for Unicode Block 'Miscellaneous Technical'.

Algumas fontes tipográficas APL Wiki. APL Characters. Acesso em 7Jul2018. que incluem os símbolos requeridos por APL conforme o padrão Unicode são: APL385 Unicode Dejavu Sans Mono DejaVu Fonts. FreeMono Projeto GNU − Free Font. GNU Unifont Quivira Quivira Font. Rursus Compact Mono Font Library − Rursus Compact Mono Font. (N.B. Na versão 1.10, ⊥ U+22a5 e ⊤ U+22a4 estão trocados de lugar!) SImPL Symbola Font Library − Symbola.

Símbolos APL e Layouts de Teclado

thumb|350px|Esquema de teclado com mapeamento de símbolos APL básicos. Notar diversas associações com as letras de cada tecla, por semelhança visual (⍺a; ⍵w; ∊e; ⎕L; ○o; ⍳i) ou por inicial da função ou do símbolo (⊥base; |módulo ou magnitude; ⋆potência; ~til; ⍴rô). thumb|350px|Esquema de teclado com símbolos de APL2. Inclui letras maiúsculas sublinhadas, entre outros símbolos.

Para solucionar o problema da falta de caracteres especiais nos conjuntos padrão (como o ASCII, por exemplo), alguns interpretadores APL têm mapeamentos ou conjuntos de teclas simultâneas para a entrada destes. Uma das associações que se procurou fazer, para facilitar a busca, é relacionar os símbolos com as suas respectivas letras iniciais como no caso do símbolo de interrogação '?' em cima da letra 'Q' (Em inglês question mark) ou o símbolo '∇' em cima da letra 'G' (Em inglês: gradient).

As figuras ao lado ilustram dois exemplos de teclados com os símbolos APL e APL2.

Configuração de teclado em X Window System (GNU/Linux e outros sistemas) Em sistemas GNU/Linux com X Window System, pode-se ativar o layout apl com o programa setxkbmap. No exemplo a seguir, definem-se os layouts Brasil(ABNT2) e APL(Dyalog), de modo que a tecla Caps_Lock passa a ativar o modo APL enquanto estiver pressionada (o comportamento normal dessa tecla passa a Alt+Caps_Lock).

setxkbmap -query setxkbmap -layout br,apl -variant abnt2,dyalog -option grp:caps_switch setxkbmap -query

Elementos da linguagem Iverson descrevia a linguagem APL usando termos das linguagens naturais, como, por exemplo: substantivos (nouns): constantes, como 3 ou ¯2 (numéricas) e 't' ou '1' (caracteres); pronomes (pronouns): identificadores (nomes associados a substantivos); verbos (verbs): funções; advérbios (adverbs): operadores que modificam a aplicação de funções; conjunções (conjunctions): operadores que combinam funções; verbo de ligação (copula): é o operador de atribuição ←; comparativos (comparatives): operadores como =, ≠ ou ≤.

Vetorização O tipo principal de estrutura de dados de APL é o arranjo ou array, com zero, uma ou mais dimensões. Tipicamente, as operações aplicam-se tanto a escalares (sem dimensão) quanto a vetores (uma dimensão), matrizes (duas dimensões) e arranjos multidimensionais (com qualquer número de dimensões suportado pela implementação). Dessa forma, dispensam-se laços explícitos na maioria dos casos. O funcionamento é similar ao do MATLAB, cuja linguagem teve em APL um de seus modelos. H. James de St. Germain. Vectorized (or Array) Operations. University of Utah.

Veja-se o exemplo de sessão interativa abaixo, em que as instruções da pessoa operadora estão recuadas por 6 espaços, e as respostas do programa começam na margem esquerda.

1 2 3 + 4 5 6 ⍝ Somas dos elementos correspondentes de dois vetores 5 7 9 3 × 1 2 3 ⍝ Multiplicação de um escalar por um vetor 3 6 9 2 × 4 - 1 ⍝ APL interpreta-se da direita para a esquerda 6 2 × (4 - 1) 6 (2 × 4) - 1 7 X ← 1 2 3 1000 ⍝ X é um vetor com 4 elementos X ⍝ Mostra X 1 2 3 1000 Y ← ⊃ (1 2 3 4) (1.1 2.2 3.3 4.4) Y ⍝ Y é uma matriz 2×4 1 2 3 4 1.1 2.2 3.3 4.4 +/X ⍝ Soma as linhas de X 1006 +⌿Y ⍝ Soma as colunas de Y 2.1 4.2 6.3 8.4 Z ← ⍳ 10 ⍝ Z é um vetor de índices com 10 elementos Z ⍝ Mostra Z 1 2 3 4 5 6 7 8 9 10 M ← X∘.×Z ⍝ Multiplica todos os elementos de X e Z M 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 ⍴M ⋄ ⍴⍴M ⍝ Tamanho (⍴) e número de dimensões (⍴⍴) de M 4 10 2

Ambivalência dos símbolos Em APL, cada um dos símbolos pode ter duas funções a ele associadas. Segundo Kenneth Iverson, o motivo para isso é representar um grande número de funções através de um pequeno vocabulário de símbolos:

<blockquote> Uma economia significativa de símbolos, em oposição a economia de funções, é atingida ao se permitir que cada símbolo represente tanto uma função unária [i.e., uma função de um argumento] quanto uma função binária, da mesma maneira como o sinal de menos é comumente usado para ambas subtração e negação. Podendo as duas funções serem relacionadas entre si, como no caso do sinal de menos, a memorização dos símbolos fica facilitada.<ref name=IversonNotationTool> IVERSON, Kenneth. Notation as a Tool of Thought. 1979. (1979 Turing Award Lecture).[Há também uma versão com postscript, de 1986: iverson.pdf.]</ref> </blockquote>

Por exemplo, o símbolo ⍳ (iota), na forma unária (prefixa), é um gerador de índices. Ele gera uma sequência de números inteiros em ordem ascendente, conforme o número à sua direita. Já na forma binária, o operador ⍳ é infixo (sintaxe X⍳E), e sua função é localizar o índice da primeira ocorrência do elemento E em X:

⍝ iota unário ⍳ 10 ⍝ expressão 1 2 3 4 5 6 7 8 9 10 ⍝ resultado

⍝ iota binário 'anaconda' ⍳ 'n' ⍝ primeira ocorrência de 'n' em 'anaconda'? 2 ⍝ resultado: segunda letra 'paladar' ⍳ 'apl' ⍝ primeira ocorrência das letras 'a', 'p' e 'l' em 'paladar'? 2 1 3 ⍝ resultado: 'a':2, 'p':1, 'l':3

Outros exemplos:

⍴ ⍝ ⍴ (rô) infixo "formata" o arg. da direita com as dimensões dadas à esquerda. 2 3 ⍴ 1 2 3 'a' 'b' 'c' ⍝ gera matriz com 2 linhas e 3 colunas: 1 2 3 a b c (3 4 ⍴ 1) ⍝ gera matriz com 3 linhas e 4 colunas com o número 1: 1 1 1 1 1 1 1 1 1 1 1 1 ⍝ ⍴ unário retorna o "formato" (dimensões) do argumento à sua direita: ⍴ (3 4 ⍴ 1) 3 4

⌈ e ⌊ ⍝ ⌈ unário é a função teto (arredonda para cima) ⌈ 1.1 2 ⍝ ⌊ unário é a função piso (arredonda para baixo) ⌊ 1.1 1 ⍝ na forma binária, ⌈ e ⌊ retornam resp. o máximo e o mínimo dos argumentos: 2 ⌈ 3 3 2 ⌊ 3 2

Ordem de avaliação de expressões Em APL, as expressões são avaliadas da direita para a esquerda, e todas as funções têm a mesma precedência. Parênteses podem ser necessários para determinar a prioridade de avaliação: 2 × 2 + 2 × 3 + 2 24 (2 × (2 + (2 × (3 + 2)))) 24 (2 × 2) + (2 × 3) + 2 12

“Advérbios” O operador ⍨ permuta os operandos de uma função binária: 4 ÷ 2 2 4 ÷⍨ 2 ⍝ equivale a 2÷4 0.5

Quando o operando esquerdo é omitido, ⍨ usa o operando direito em seu lugar: 2 × 2 4 ×⍨ 2 ⍝ equivale a 2×2 4

/ e ⌿ intercalam a função entre os elementos do arranjo, retornando o resultado final (tal como o operador reduce em LISP): +/ 1 2 3 ⍝ equivale a 1+2+3 6 -/ 1 2 3 4 ⍝ equivale a 1-(2-(3-4)) ¯2 M ← 2 3 ⍴ 1 2 M 1 2 1 2 1 2 + / M ⍝ em matrizes, / opera ao longo das linhas (linha por linha) 4 5 + ⌿ M ⍝ em matrizes, ⌿ opera ao longo das colunas (coluna por coluna) 3 3 3

\ e ⍀ atuam de maneira similar, mas incluem os resultados parciais: +\ 1 2 3 1 2 6 -\ 1 2 3 4 1 ¯1 2 ¯2 M ← 2 3 ⍴ 1 2 M 1 2 1 2 1 2 + \ M ⍝ em matrizes, \ opera ao longo das linhas 1 3 4 2 3 5 + ⍀ M ⍝ em matrizes, ⍀ opera ao longo das colunas 1 2 1 3 3 3

Estruturas de controle de fluxo Sintaxe Exceto em alguns dialetos, APL não contém instruções como if, if/else, switch/case, for, repeat. O controle do fluxo de execução é feito através de saltos (branching = ramificação) Brad Miller, David Ranum, Jeffrey Elkner, Peter Wentworth, Allen B. Downey, Chris Meyers & Dario Mitchell. Como Pensar Como um Cientista da Computação ­­− Decisões e Seleção. (Tradução do livro “How to Think Like a Computer Scientist: Interactive Version”, de Brad Miller e David Ranum). Acesso em 6Jul2018. e chamadas de funções.

Ramificações (→) são permitidas apenas dentro da definição de funções, através de uma instrução do tipo → NUMLINHA ou → (CONDICAO)/NUMLINHA. O código → 0 (escape) termina a execução da função. Laços raramente são necessários, por a linguagem ser especialmente projetada para o tratamento de arranjos (arrays). Assim, o principal uso de → é para execução condicional.

Outra forma de execução condicional pode ser obtida com o operador ⍎ (execute), que avalia uma cadeia de caracteres como uma instrução em APL:

X ← 1 ⍎(X>0)/ '2+5' 7 ⍎∊(1 0=(X>0)) / '⎕ ← ''X é maior que zero.''' '⎕ ← ''X não é maior que zero.''' X é maior que zero.

X ← 0 ⍎(X>0)/ '2+5' ⍝ (Nada é executado.) ⍎∊(1 0=(X>0)) / '⎕ ← ''X é maior que zero.''' '⎕ ← ''X não é maior que zero.''' X não é maior que zero.

Organização do código