DEV Community

Patrícia Villela for Feministech

Posted on

Símbolos de APL: "Mais" e "Menos"

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).
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]
Enter fullscreen mode Exit fullscreen mode

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). 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
           ∧
Enter fullscreen mode Exit fullscreen mode

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).
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
      ∧
Enter fullscreen mode Exit fullscreen mode

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). 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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!

Top comments (0)