Símbolos de APL: "Mais" e "Menos"
Tags: apl, programming, programacao, dyalog
Published: 2022-11-11 11:00:00

> AVISO! Essa série de artigos usará exemplos rodados em Dyalog APL, a implementação da Dyalog.

> AVISO 2! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas **identadas à direita** (as linhas identadas à esquerda são os resultados) nesse site: https://tryapl.org

Nesse artigo vamos falar de uma vez de 2 símbolos! Mas não se assustem, eles são bem simples porque suas funções já são conhecidas por nós. No entanto, precisamos passar rapidamente por um conceito central da APL.

## Monádico vs Diático
Em primeiro lugar, não devemos confundir "monádico" aqui com "monads" em linguagens como Haskell. Os termos monádico e diático aqui querem dizer, respectivamente, que a função recebe um ou dois argumentos.

## Mais (`+`)
A função monádica do `+` é "conjugar" ("Conjugate" na [documentação](https://aplwiki.com/wiki/Conjugate)).
A função conjugar retorna o argumento passado com a parte complexa negada quando aplicável.

(o formato de números complexos é `aJb`, com `a` sendo a parte real e `b` sendo a parte imaginária)

```
      a b c d e←2 2J2 2J¯2 't' ⎕NULL
      +a ⍝ número real retorna igual
2
      +b ⍝ complexo inverte parte complexa
2J¯2
      +c
2J2
      +d ⍝ strings de caracteres não mudam
t
      +e ⍝ valor null não muda
[Null]
```

A razão para os valores `[Null]` e strings de caracteres retornarem o mesmo é histórica e não vem ao caso, mas tem a vez com o uso desse símbolo para a função "identidade", que será tratada em outro artigo.

A função diática do `+` é "soma" ("Add" na [documentação](https://aplwiki.com/wiki/Add)). A soma funciona da maneira esperada. Porém, há algumas propriedades interessantes.

```
      1+1
2
      1+1 2 3 4
2 3 4 5
      1 2 3 4+5 6 7 8
6 8 10 12
      1 2+3 4 5
LENGTH ERROR: Mismatched left and right argument shapes
      1 2+3 4 5
         ∧
      1+3 3⍴1
2 2 2
2 2 2
2 2 2
      (3 3⍴2)+(3 3⍴1)
3 3 3
3 3 3
3 3 3
      3 3 3+3 3⍴1
RANK ERROR: Mismatched left and right argument ranks
      3 3 3+3 3⍴1
           ∧
```
A primeira operação é de dois valores escalares (arrays sem dimensão). Ocorre a soma normalmente.
A segunda operação é de um valor escalar e um vetor (array com 1 dimensão). Nesse caso o valor escalar é somado a cada um dos elementos do vetor.
A terceira operação é uma soma de dois vetores. Nesse caso, como ambos os vetores tem a mesma dimensão (4 elementos), cada índice de um vetor é somado a cada índice do outro vetor.

A regra básica é que é possível somar um escalar com qualquer outro array de qualquer dimensão e dois arrays de mesmas dimensões. No primeiro caso todos os elementos do array serão acrescidos do valor escalar e no segundo caso cada elemento de um dos arrays é acrescido do valor do elemento correspondente.

## Menos (`-`)
A função monádica do `-` é "negar" ("Negate" na [documentação](https://aplwiki.com/wiki/Negate)).
A função negar retorna o argumento negado.

```
      -¯2.5 1e20 3j¯4
2.5 ¯1E20 ¯3J4
      -'t'
DOMAIN ERROR
      -'t'
      ∧
      -⎕NULL
DOMAIN ERROR
      -⎕NULL
      ∧
```

Note que há também um exemplo parecido com o de `+` usando `t` e `⎕NULL` como argumentos de "negar". O erro `DOMAIN ERROR` é comum para qualquer uma das funções aritméticas quando usadas com caracteres e valores nulos, e só não ocorre com `+` por razões históricas.

A função diática do `-` é "subtração" ("Subtract" na [documentação](https://aplwiki.com/wiki/Subtract)). A subtração funciona da maneira esperada.

```
      6-1-2
7
      5-2
3
      4-1 2 3 4
3 2 1 0
      1 2 3 4-5 6 7 8
¯4 ¯4 ¯4 ¯4
```
A regra da subtração é a mesma da soma e de qualquer outra operação aritmética: é possível subtrair um escalar do outro, um array de um escalar e dois arrays de mesma dimensão.

Atenção! O símbolo `-` e `¯` são diferentes.
```
      -2
¯2
      ¯2
¯2
```
O resultado é o mesmo, mas no primeiro está sendo executada a função "negar" com "2" como argumento. No segundo está sendo criado o número "-2".

## Conclusão
Falamos dos dois primeiros operadores aritméticos da APL e ainda falamos de funções monádicas e diáticas. Espero que estejam gostando ^^

Até a próxima!