<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Patrícia Villela</title>
    <description>The latest articles on DEV Community by Patrícia Villela (@patriciavillela).</description>
    <link>https://dev.to/patriciavillela</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F869405%2F6d12222f-b095-438f-9b9f-800ef8cf9eab.jpg</url>
      <title>DEV Community: Patrícia Villela</title>
      <link>https://dev.to/patriciavillela</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patriciavillela"/>
    <language>en</language>
    <item>
      <title>Símbolos de APL: "Estrela" e "Log"</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Fri, 25 Nov 2022 11:00:00 +0000</pubDate>
      <link>https://dev.to/feministech/simbolos-de-apl-estrela-e-log-4bn1</link>
      <guid>https://dev.to/feministech/simbolos-de-apl-estrela-e-log-4bn1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AVISO! Essa série de artigos usará exemplos rodados em Dyalog APL, a implementação da Dyalog.&lt;/p&gt;

&lt;p&gt;AVISO 2! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas &lt;strong&gt;identadas à direita&lt;/strong&gt; (as linhas identadas à esquerda são os resultados) nesse site: &lt;a href="https://tryapl.org" rel="noopener noreferrer"&gt;https://tryapl.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Garçom, manda mais dois símbolos aí!&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrela (&lt;code&gt;*&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;*&lt;/code&gt; é "exponencial" ("Exponential" na &lt;a href="https://aplwiki.com/wiki/Exponential" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
A função "exponencial" retorna &lt;code&gt;e&lt;/code&gt; elevado ao argumento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      *1 2 3
2.718281828 7.389056099 20.08553692
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;e&lt;/code&gt; é a constante de Euler, base dos logaritmos naturais.&lt;/p&gt;

&lt;p&gt;A função diátida de &lt;code&gt;*&lt;/code&gt; é "exponenciação" ("Power" na &lt;a href="https://aplwiki.com/wiki/Power" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
Essa função retorna a exponenciação com o argumento da esquerda como base e o da direita como expoente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      2*3
8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Log (&lt;code&gt;⍟&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;⍟&lt;/code&gt; é "logaritmo natural" ("Natural Logarithm" na &lt;a href="https://aplwiki.com/wiki/Natural_Logarithm" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
O retorno dessa função é o logaritmo natural (aquele com base &lt;code&gt;e&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⍟1 (*1) 2
0 1 0.6931471806
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O segundo elemento do vetor é &lt;code&gt;e&lt;/code&gt;. É evidente que o logaritmo natural de &lt;code&gt;e&lt;/code&gt; é 1.&lt;/p&gt;

&lt;p&gt;A função diática do &lt;code&gt;⍟&lt;/code&gt; é "logaritmo" ("Logarithm" na &lt;a href="https://aplwiki.com/wiki/Logarithm" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;). O retorno dessa função é o logaritmo com argumento da esquerda como base e o argumento da direita como logaritmando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      10⍟100
2
      2⍟2 4 8 16
1 2 3 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com essas duas novas funções finalizamos as funções aritméticas da APL!&lt;br&gt;
Esse artigo foi menor ainda, mas não há tanto mais o que dizer!&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>apl</category>
      <category>programming</category>
      <category>programacao</category>
      <category>dyalog</category>
    </item>
    <item>
      <title>Símbolos de APL: "Vezes" e "Divisão"</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Fri, 18 Nov 2022 11:00:00 +0000</pubDate>
      <link>https://dev.to/feministech/simbolos-de-apl-vezes-e-divisao-51bd</link>
      <guid>https://dev.to/feministech/simbolos-de-apl-vezes-e-divisao-51bd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AVISO! Essa série de artigos usará exemplos rodados em Dyalog APL, a implementação da Dyalog.&lt;/p&gt;

&lt;p&gt;AVISO 2! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas &lt;strong&gt;identadas à direita&lt;/strong&gt; (as linhas identadas à esquerda são os resultados) nesse site: &lt;a href="https://tryapl.org" rel="noopener noreferrer"&gt;https://tryapl.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse artigo vem mais 2 símbolos!&lt;/p&gt;

&lt;h2&gt;
  
  
  Vezes (&lt;code&gt;×&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;×&lt;/code&gt; é "direção" ("Signum" na &lt;a href="https://aplwiki.com/wiki/Signum" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
A função "direção" retorna o sinal do argumento&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ×3 ¯10 0
1 ¯1 0
      ×3J4
0.6J0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 é positivo, -10 é negativo e 0 é zero. Esse passo é o comum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ×3J4
0.6J0.8
      3J4÷|3J4
0.6J0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso do número complexo a função é um pouco mais complexa. Ela é a divisão do número pela sua magnitude.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      2×3
6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No entanto há uma diferença de com fazemos multiplicação de matrizes. Quando multiplicamos matrizes, além de a restrição ser apenas que o número de colunas de uma deve ser igual ao número de linhas da outra, cada elemento da matriz resultante é a soma dos produtos dos elementos de cada coluna de uma matriz por cada linha da outra matriz.&lt;/p&gt;

&lt;p&gt;A matriz&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1   2   3
4   5   6
7   8   9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;multiplicada pela matriz&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1   2   3
4   5   6
7   8   9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;resulta na matriz&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30  36  42
66  81  96
102 126 150
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No entanto a razão de ser da APL foi uma necessidade de regularização da notação matemática. Por isso a multiplicação de matrizes funciona da mesma maneira que a adição, elemento a elemento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      3 3⍴2
2 2 2
2 2 2
2 2 2
      (3 3⍴2)×3 3⍴2
4 4 4
4 4 4
4 4 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Divisão (&lt;code&gt;÷&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;÷&lt;/code&gt; é "recíproco" ("Reciprocal" na &lt;a href="https://aplwiki.com/wiki/Reciprocal" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
O retorno dessa função é o inverso do agumento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ÷1 ¯2 1J2
1 ¯0.5 0.2J¯0.4
      ÷0
DOMAIN ERROR: Divide by zero
      ÷0
      ∧
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O recíproco de 0 claro que dá um erro de divisão por zero.&lt;/p&gt;

&lt;p&gt;A função diática do &lt;code&gt;÷&lt;/code&gt; é "dividir" ("Divide" na &lt;a href="https://aplwiki.com/wiki/Divide" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;). A divisão também funciona da maneira esperada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      2 0 5÷4 0 2
0.5 1 2.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notem que há mais uma incongruência com a matemática padrão. Em APL, 0÷0 é 1!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Esse artigo foi menor mas ainda assim cobrimos dois outros operadores aritméticos da APL.&lt;br&gt;
Bom APL!&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>apl</category>
      <category>programming</category>
      <category>programacao</category>
      <category>dyalog</category>
    </item>
    <item>
      <title>Símbolos de APL: "Mais" e "Menos"</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Fri, 11 Nov 2022 11:00:00 +0000</pubDate>
      <link>https://dev.to/feministech/simbolos-de-apl-x-e-42mm</link>
      <guid>https://dev.to/feministech/simbolos-de-apl-x-e-42mm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AVISO! Essa série de artigos usará exemplos rodados em Dyalog APL, a implementação da Dyalog.&lt;/p&gt;

&lt;p&gt;AVISO 2! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas &lt;strong&gt;identadas à direita&lt;/strong&gt; (as linhas identadas à esquerda são os resultados) nesse site: &lt;a href="https://tryapl.org" rel="noopener noreferrer"&gt;https://tryapl.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monádico vs Diático
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mais (&lt;code&gt;+&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;+&lt;/code&gt; é "conjugar" ("Conjugate" na &lt;a href="https://aplwiki.com/wiki/Conjugate" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
A função conjugar retorna o argumento passado com a parte complexa negada quando aplicável.&lt;/p&gt;

&lt;p&gt;(o formato de números complexos é &lt;code&gt;aJb&lt;/code&gt;, com &lt;code&gt;a&lt;/code&gt; sendo a parte real e &lt;code&gt;b&lt;/code&gt; sendo a parte imaginária)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      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]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A razão para os valores &lt;code&gt;[Null]&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;A função diática do &lt;code&gt;+&lt;/code&gt; é "soma" ("Add" na &lt;a href="https://aplwiki.com/wiki/Add" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;). A soma funciona da maneira esperada. Porém, há algumas propriedades interessantes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      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
           ∧
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A primeira operação é de dois valores escalares (arrays sem dimensão). Ocorre a soma normalmente.&lt;br&gt;
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.&lt;br&gt;
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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;h2&gt;
  
  
  Menos (&lt;code&gt;-&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;A função monádica do &lt;code&gt;-&lt;/code&gt; é "negar" ("Negate" na &lt;a href="https://aplwiki.com/wiki/Negate" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;).&lt;br&gt;
A função negar retorna o argumento negado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      -¯2.5 1e20 3j¯4
2.5 ¯1E20 ¯3J4
      -'t'
DOMAIN ERROR
      -'t'
      ∧
      -⎕NULL
DOMAIN ERROR
      -⎕NULL
      ∧
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;A função diática do &lt;code&gt;-&lt;/code&gt; é "subtração" ("Subtract" na &lt;a href="https://aplwiki.com/wiki/Subtract" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;). A subtração funciona da maneira esperada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Atenção! O símbolo &lt;code&gt;-&lt;/code&gt; e &lt;code&gt;¯&lt;/code&gt; são diferentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      -2
¯2
      ¯2
¯2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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".&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Falamos dos dois primeiros operadores aritméticos da APL e ainda falamos de funções monádicas e diáticas. Espero que estejam gostando ^^&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>apl</category>
      <category>programming</category>
      <category>programacao</category>
      <category>dyalog</category>
    </item>
    <item>
      <title>Símbolos de APL: atribuição</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Fri, 04 Nov 2022 14:14:43 +0000</pubDate>
      <link>https://dev.to/feministech/simbolos-de-apl--4mj6</link>
      <guid>https://dev.to/feministech/simbolos-de-apl--4mj6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AVISO! Essa série de artigos usará exemplos rodados em Dyalog APL, a implementação da Dyalog.&lt;/p&gt;

&lt;p&gt;AVISO 2! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas &lt;strong&gt;identadas à direita&lt;/strong&gt; (as linhas identadas à esquerda são os resultados) nesse site: &lt;a href="https://tryapl.org" rel="noopener noreferrer"&gt;https://tryapl.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O primeiro símbolo que vou apresentar é &lt;code&gt;←&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esse é o símbolo de "atribuição" ("Assignment" na &lt;a href="https://aplwiki.com/wiki/Assignment" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;). A maioria das linguagens de programação usam o símbolo &lt;code&gt;=&lt;/code&gt; para esse fim. Em APL, &lt;code&gt;=&lt;/code&gt; é reservado para comparação de igualdade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      a←1
      a
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A primeira linha atribui o valor &lt;code&gt;1&lt;/code&gt; para a variável &lt;code&gt;a&lt;/code&gt; e a segunda linha a exibe. A terceira linha é o retorno da segunda.&lt;/p&gt;

&lt;p&gt;A atribuição não é restrita a valores escalares (que em APL são arrays com uma dimensão).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      a←1 2 3 4
      a
1 2 3 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A atribuição também serve para outras coisas, como redirecionamento para o display usando o caracter &lt;code&gt;⎕&lt;/code&gt; (é um quadrado mesmo, chamado "Quad", não é erro de encoding. Esse símbolo será elaborado em outro artigo).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⎕←a←1
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim como em linguagens mais populares hoje em dia, é possível atribuir uma modificação, como por exemplo um incremento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      a
1
      a+←1
      a
2
      a-←1
      a
1
      a×←10
      a
10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é possível fazer atribuição de arrays de mesmas dimensões. O efeito disso é a distribuição dos valores nas variáveis listadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      a b c←1 2 3
      a
1
      b
2
      c
3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por enquanto é isso. Em resumo pode-se entender esse símbolo como um símbolo de transferência de valor, tanto para uma variável, quanto para o display.&lt;/p&gt;

</description>
      <category>apl</category>
      <category>programming</category>
      <category>programacao</category>
      <category>dyalog</category>
    </item>
    <item>
      <title>O que é o Advent Of Code?</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Thu, 03 Nov 2022 16:35:58 +0000</pubDate>
      <link>https://dev.to/feministech/o-que-e-o-advent-of-code-1m0</link>
      <guid>https://dev.to/feministech/o-que-e-o-advent-of-code-1m0</guid>
      <description>&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;Pra saber o que é o Advent Of Code, precisamos saber o que é o "advento".&lt;/p&gt;

&lt;h3&gt;
  
  
  Advento
&lt;/h3&gt;

&lt;p&gt;Advento é um período que antecede o Natal, do dia 27 de novembro ao dia 24 de dezembro. As suas origens não vem ao caso. O mais importante é entender uma prática que acontece nesse período.&lt;/p&gt;

&lt;p&gt;Há uma tradição que consiste em guardar um docinho em cada uma de 24 caixinhas numeradas, cada uma representando um dia de dezembro antecedendo o Natal. A cada dia a dona desse calendário vai lá e pega um dos doces (que podem ser substituídos por toda sorte de coisa, inclusive cartas) e come. E nessa tradição que oi Advent Of Code se inspira. &lt;/p&gt;

&lt;h3&gt;
  
  
  Então o que é?
&lt;/h3&gt;

&lt;p&gt;É uma série de desafios que vai do dia primeiro ao dia 24 de dezembro, um desafio por dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advent Of Code
&lt;/h2&gt;

&lt;p&gt;Todo Advent Of Code começa com uma história sobre o Papai Noel se preparando para entregar os presentes de Natal. No entanto, algo acontece e é seu trabalho como desenvolvedora ajudar o bom velhinho a se livrar dos problemas e dar um Natal feliz a toda gente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como participar?
&lt;/h3&gt;

&lt;p&gt;Basta acessar &lt;a href="https://adventofcode.com" rel="noopener noreferrer"&gt;https://adventofcode.com&lt;/a&gt; e se autenticar. Os problemas aparecem todo dia à meia-noite (UTC-5, ou seja, 2 da manhã para quem está no horário de Brasília) e ficam disponíveis pra sempre. Inclusive, se você quiser fazer um esquenta no de 2021, &lt;a href="https://adventofcode.com/2021" rel="noopener noreferrer"&gt;fique à vontade&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ah, e o desafio é agnóstico no que diz respeito à linguagem. Além disso, não é necessário usar a mesma linguagem o desafio todo, então mandem ver!&lt;/p&gt;

&lt;h2&gt;
  
  
  E você?
&lt;/h2&gt;

&lt;p&gt;Eu pretendo participar esse ano, assim como participei ano passado. No entanto, pretendo completar dessa vez, nem que eu tenha ajuda de outras pessoas.&lt;br&gt;
Vou começar com &lt;a href="https://dev.to/feministech/voce-conhece-apl-24b6"&gt;APL&lt;/a&gt;. Quando eu vir que não consigo mais continuar com essa linguagem porque eu não tenho tanta experiência com ela assim, vou tentar com alguma outra e depois arranjar uma solução em APL no discord que eu faço parte.&lt;/p&gt;

&lt;p&gt;Pretendo também relatar isso por meio de vídeos no YouTube e artigos aqui.&lt;/p&gt;

&lt;p&gt;Ansiosas?&lt;/p&gt;

</description>
      <category>programacaorecreativa</category>
      <category>adventofcode</category>
      <category>programming</category>
      <category>recreationalprogramming</category>
    </item>
    <item>
      <title>Expressões Regulares IV - as três regras da regex I - backtracking</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Thu, 15 Sep 2022 22:35:05 +0000</pubDate>
      <link>https://dev.to/feministech/expressoes-regulares-iv-as-tres-regras-da-regex-i-backtracking-16j1</link>
      <guid>https://dev.to/feministech/expressoes-regulares-iv-as-tres-regras-da-regex-i-backtracking-16j1</guid>
      <description>&lt;p&gt;Alguns anos atrás eu comecei a falar que há três regras para se usar expressões regulares&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;não use regex&lt;/li&gt;
&lt;li&gt;reconsidere se você precisa usar regex&lt;/li&gt;
&lt;li&gt;conheça sua engine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pode parecer engraçado eu usar duas regras para desencorajar o uso de regex sendo que eu estudo isso e estou inclusive escrevendo uma série de artigos dedicados a ensinar como usá-la, mas eu vou explicar.&lt;/p&gt;

&lt;p&gt;A primeira e a segunda regra são na verdade a mesma e estão duplicadas para efeito de ênfase.&lt;/p&gt;

&lt;p&gt;Quando começamos a aprender regex (e até quando já sabemos há um tempo), ficamos tentados a usar para solucionar qualquer problema. Daí fazemos coisas como essa para validar uma data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/^(?:([0-1])|(2)|(3))(?(1)[0-9])(?(2)(?:([0-8])|(9)))(?(3)[0-1])\/
(?:(01|03|05|07|09|11)|(04|06|08|10|12)|(02))(?(3)(?(8)(?!)))\/\d*
(?:(04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|
88|92|96)|(\d\d))(?:(00)|(04|08|12|16|20|24|28|32|36|40|44|48|52|56|
60|64|68|72|76|80|84|88|92|96)|\d{2})(?(2)(?(5)(?(8)(?(11)(?(9)|
(?!))|(?(12)|(?!))))))/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(podem testá-la, a propósito 😉 &lt;a href="https://regex101.com/r/aqEsf1/1" rel="noopener noreferrer"&gt;https://regex101.com/r/aqEsf1/1&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Essa atrocidade de regex valida não somente o formato da data (que precisa ser &lt;code&gt;dd/MM/yyyy&lt;/code&gt;), mas também valida se a data é válida. Dia 31 de setembro não é validada. Dia 29 de fevereiro de 2021 não é validada. Eu tenho um certo orgulho dessa regex, francamente (sim, eu que fiz).&lt;/p&gt;

&lt;p&gt;Porque não a usamos então? Eu apresento dois motivos.&lt;/p&gt;

&lt;p&gt;O primeiro é mais óbvio: essa regex é incompreensível e um pesadelo de se mexer. Se houver algum bug nela, qualquer tentativa de mudá-la será muito custosa.&lt;br&gt;
O segundo não é tão óbvio, mas deve ser simples de entender: essa regex é muito custosa para a engine.&lt;/p&gt;

&lt;p&gt;Para explicar, precisamos falar sobre como a engine funciona internamente. Apertem os cintos e vamos lá!&lt;/p&gt;
&lt;h2&gt;
  
  
  Funcionamento interno das engines de regex
&lt;/h2&gt;

&lt;p&gt;Embora cada engine tenha uma particularidade, podemos dividí-las em duas categorias: engines &lt;em&gt;text-directed&lt;/em&gt; e &lt;em&gt;regex-directed&lt;/em&gt;.&lt;br&gt;
Não falaremos de engines &lt;em&gt;text-directed&lt;/em&gt; aqui, pois seu funcionamento é trivial porque não existe &lt;em&gt;backtracking&lt;/em&gt; e as engines mais usadas são as &lt;em&gt;regex-directed&lt;/em&gt;. Vamos a elas então.&lt;/p&gt;

&lt;p&gt;As engines &lt;em&gt;regex-directed&lt;/em&gt;, chamadas a partir de agora somente de &lt;em&gt;engines&lt;/em&gt;, funcionam basicamente da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enquanto houver tokens na regex, pegue o próximo token&lt;/li&gt;
&lt;li&gt;Tente dar match com o próximo caracter da string&lt;/li&gt;
&lt;li&gt;Se houver match, avance para o próximo token da regex e o próximo caracter da string&lt;/li&gt;
&lt;li&gt;Se não, volte até uma posição anterior da regex para testar um outro caminho por ela (esse é o &lt;em&gt;backtracking&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos de exemplo. Vamos aplicar a regex &lt;code&gt;/&amp;lt;.*?&amp;gt;/&lt;/code&gt; no texto &lt;code&gt;&amp;lt;span&amp;gt;Teste&amp;lt;/span&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enquanto houver tokens na regex, pegue o próximo token (&lt;code&gt;&amp;lt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dá match com o próximo caracter da string (&lt;code&gt;&amp;lt;&lt;/code&gt;)
1 Houve match, então avança para o próximo token da regex (&lt;code&gt;.*?&lt;/code&gt;) e próximo caracter da string (&lt;code&gt;s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;O token &lt;code&gt;.*?&lt;/code&gt; é o quantificador &lt;em&gt;lazy&lt;/em&gt; que vai dar match no mínimo possível para que a regex seja válida. A primeira tentativa é de um match sem tamanho (match em '').&lt;/li&gt;
&lt;li&gt;Dá match, então avança para o próximo token da regex (&lt;code&gt;&amp;gt;&lt;/code&gt;) e o próximo caracter da string (&lt;code&gt;s&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Não dá match, então retorna a regex pro token anterior (&lt;code&gt;.*?&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dá match, pois &lt;code&gt;.&lt;/code&gt; dá match em qualquer caracter (exceto quebra de linha), então avança para o próximo token da regex (&lt;code&gt;&amp;gt;&lt;/code&gt;) e o próximo caracter da string (&lt;code&gt;p&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Não dá match, então retorna regex (&lt;code&gt;.*?&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.*?&lt;/code&gt; deu match em &lt;code&gt;s&lt;/code&gt; antes, mas agora precisa dar match em &lt;code&gt;sp&lt;/code&gt;. Tudo bem, pois &lt;code&gt;.&lt;/code&gt; dá match em qualquer caracter (exceto quebra de linha) e &lt;code&gt;*&lt;/code&gt; dá match em mais de um caracter.&lt;/li&gt;
&lt;li&gt;Dá match, então avança regex (&lt;code&gt;&amp;gt;&lt;/code&gt;) e string (&lt;code&gt;a&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Não dá match. Isso vai se repetir até a regex encontrar na string o caracter &lt;code&gt;&amp;gt;&lt;/code&gt;. Nesse caso, ela vai dar match e retornar &lt;em&gt;ok&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Segue um esquema tirado da aplicação &lt;a href="https://www.regexbuddy.com/" rel="noopener noreferrer"&gt;RegexBuddy&lt;/a&gt; para explicar melhor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Beginning match attempt at character 0
&amp;lt;
&amp;lt; ok
&amp;lt; backtrack
&amp;lt;s
&amp;lt;s backtrack
&amp;lt;sp
&amp;lt;sp backtrack
&amp;lt;spa
&amp;lt;spa backtrack
&amp;lt;span
&amp;lt;span backtrack
&amp;lt;span&amp;gt;
Match found in 11 steps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(espaços adicionados por clareza)&lt;/p&gt;

&lt;p&gt;Dessa maneira, é possível notar que há as engines vão e voltam na string até encontrar uma solução para a regex. Vamos pegar o diagrama do RegexBuddy para uma data e aquela regex.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Beggining match attempt at character 0
ok
1
1
1
12
12
12 ok
12 ok
12 ok
12 ok
12/
12/0
12/0 backtrack
12/0
12/0 backtrack
12/0
12/0 backtrack
12/0
12/0 backtrack
12/0
12/0 backtrack
12/ backtrack
12/ backtrack
12/0
12/0 backtrack
12/0
12/0 backtrack
12/0
12/0 backtrack
12/ backtrack
12/ backtrack
12/ backtrack
12/0
12/02
12/02
12/02
12/02 ok
12/02 ok
12/02/
12/02/ backtrack
12/02/ backtrack
12/02/ backtrack
12/02/ backtrack
12/20/2
12/02/20
12/02/20
12/02/20
12/02/200
12/02/200 backtrack
12/02/20 backtrack
12/02/200
12/02/200 backtrack
12/02/200
12/02/200 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/20 backtrack
12/02/2003
12/02/2003
12/03/2003 ok
12/03/2003 ok
Match found in 81 steps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um tanto mais complexo que a solução preferida, que em Java seria algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Date date = new Date('12/02/2003');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pois a implementação do Java já testa se a data é válida ao instanciar o objeto.&lt;br&gt;
É importante lembrar que nenhuma engine de regex tem informações semânticas sobre o texto. Enquanto o Java tem como saber que &lt;code&gt;12&lt;/code&gt; na data é dia e &lt;code&gt;2003&lt;/code&gt; é ano, a engine de regex só entende texto.&lt;/p&gt;

&lt;p&gt;A mesma coisa para email. Em vez de usar uma regex monstruosa como a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\&amp;lt;(?:(?:\r\n)?[ \t])*(?:@(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\&amp;gt;(?:(?:\r\n)?[ \t])*)|(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\&amp;lt;(?:(?:\r\n)?[ \t])*(?:@(?:[^()&amp;lt;&amp;gt;@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\&amp;gt;(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\&amp;lt;(?:(?:\r\n)
?[ \t])*(?:@(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()&amp;lt;&amp;gt;@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()&amp;lt;&amp;gt;@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()&amp;lt;&amp;gt;@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\&amp;gt;(?:(
?:\r\n)?[ \t])*))*)?;\s*)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;uma solução mais simples é mandar um email para o endereço. Se estiver válido, o email chegará. Para auxiliar o usuário a preencher o formulário, basta verificar com essa regex&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.*@.*\..*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou algo parecido.&lt;/p&gt;

&lt;p&gt;A terceira regra será tratada no próximo artigo. Abraços.&lt;/p&gt;

</description>
      <category>regex</category>
      <category>expressoesregulares</category>
      <category>beginners</category>
      <category>pcre</category>
    </item>
    <item>
      <title>Expressões Regulares III - âncoras, limites de palavras e caracteres de palavras</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Mon, 12 Sep 2022 14:00:42 +0000</pubDate>
      <link>https://dev.to/feministech/expressoes-regulares-iii-ancoras-limites-de-palavras-e-caracteres-de-palavras-3epf</link>
      <guid>https://dev.to/feministech/expressoes-regulares-iii-ancoras-limites-de-palavras-e-caracteres-de-palavras-3epf</guid>
      <description>&lt;h2&gt;
  
  
  Âncoras
&lt;/h2&gt;

&lt;p&gt;"Âncora" é o nome que damos para os caracteres &lt;code&gt;^&lt;/code&gt; e &lt;code&gt;$&lt;/code&gt;. &lt;code&gt;^&lt;/code&gt; significa o início da linha e &lt;code&gt;$&lt;/code&gt; significa o fim da linha.&lt;br&gt;
Então se eu tiver a seguinte regex&lt;/p&gt;

&lt;p&gt;&lt;code&gt;^[Tt]este&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e aplicá-la ao seguinte texto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Teste unitário é um tipo de teste que visa testar
apenas uma unidade de código, como um fluxo determinado de
uma função.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A regex vai dar match apenas no primeiro &lt;code&gt;Teste&lt;/code&gt; porque ele está no início da linha, representado pelo &lt;code&gt;^&lt;/code&gt;. A mesma coisa acontece com &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A regex&lt;br&gt;
&lt;code&gt;nunca$&lt;/code&gt;&lt;br&gt;
aplicada no texto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lembre-se, nunca diga nunca
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vai dar match somente no segundo &lt;code&gt;nunca&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limites de palavras
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Limites de palavras&lt;/code&gt; é o nome que damos ao caracter especial &lt;code&gt;\b&lt;/code&gt;. Ele serve para darmos match no início ou no final de uma palavra.&lt;/p&gt;

&lt;p&gt;A regex&lt;br&gt;
&lt;code&gt;\bvel&lt;/code&gt;&lt;br&gt;
aplicado sobre o texto&lt;br&gt;
&lt;code&gt;O vel da noiva é invisível&lt;/code&gt;&lt;br&gt;
vai dar match apenas na palavra &lt;code&gt;vel&lt;/code&gt;, porque &lt;code&gt;\b&lt;/code&gt; dá o match no limite da palavra.&lt;/p&gt;

&lt;p&gt;Em contrapartida, o caracter &lt;code&gt;\B&lt;/code&gt; vai dar match em posições que &lt;code&gt;\b&lt;/code&gt; &lt;em&gt;não&lt;/em&gt; dá match.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\Bvel&lt;/code&gt;&lt;br&gt;
aplicado sobre o texto&lt;br&gt;
&lt;code&gt;O vel da noiva é invisível&lt;/code&gt;&lt;br&gt;
dá match no &lt;code&gt;vel&lt;/code&gt; de &lt;code&gt;invisível&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas como a engine sabe que a palavra acabou? Como ela decide o final da palavra &lt;code&gt;anti-herói&lt;/code&gt;? &lt;code&gt;\b&lt;/code&gt; dá match no que &lt;code&gt;\w&lt;/code&gt; não dá. &lt;code&gt;\w&lt;/code&gt; é chamado de &lt;code&gt;word character&lt;/code&gt;. Ele dá match em "caracteres de palavras", então as letras do alfabeto, algarismos e underline (&lt;code&gt;_&lt;/code&gt;). Algumas implementações, ou &lt;em&gt;flavors&lt;/em&gt;, de regex suportam Unicode por padrão, como a engine do Python. Nas que não suportam, o &lt;code&gt;ó&lt;/code&gt; de &lt;code&gt;herói&lt;/code&gt; não será reconhecido como &lt;code&gt;\w&lt;/code&gt; se não for colocada uma &lt;em&gt;flag&lt;/em&gt;, que na maioria dos &lt;em&gt;flavors&lt;/em&gt; é &lt;code&gt;u&lt;/code&gt;. Falaremos sobre &lt;em&gt;flags&lt;/em&gt; mais pra frente.&lt;br&gt;
No entanto, nenhuma engine de regex dá match no hífen (&lt;code&gt;-&lt;/code&gt;). Então se você quiser que a sua engine dê match em &lt;code&gt;anti-herói&lt;/code&gt;, você precisará da seguinte regex&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/[\w-]+/u&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Assim você engloba tanto todos os caracteres representados por &lt;code&gt;\w&lt;/code&gt; e o hífen.&lt;br&gt;
Notem que eu coloquei duas barras (&lt;code&gt;/&lt;/code&gt;), uma no começo e uma no final da regex. Esses são os separadores e indicam quando a regex começa e termina. Esses separadores não foram incluídos antes porque não eram necessários para a explicação, mas por conta da &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;u&lt;/code&gt;, foi preciso incluí-los. Novamente, falaremos sobre &lt;em&gt;flags&lt;/em&gt; mais pra frente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nessa parte foi a primeira vez que eu falei de &lt;em&gt;flavors&lt;/em&gt; de regex. É importante falar sobre isso porque o que a gente chama de &lt;em&gt;regex&lt;/em&gt; é na verdade uma especificação. Cada linguagem ou plataforma implementa de uma maneira diferente essa especificação, então agora é a primeira vez que digo uma das &lt;em&gt;regras da regex&lt;/em&gt;, que eu mesmo formulei.&lt;/p&gt;

&lt;p&gt;Regra 3: conheça muito bem sua engine de regex&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;/p&gt;

</description>
      <category>regex</category>
      <category>beginners</category>
      <category>expressoesregulares</category>
      <category>pcre</category>
    </item>
    <item>
      <title>Expressões Regulares II - classes de caracteres</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Sun, 04 Sep 2022 17:24:17 +0000</pubDate>
      <link>https://dev.to/feministech/expressoes-regulares-ii-classes-de-caracteres-46h6</link>
      <guid>https://dev.to/feministech/expressoes-regulares-ii-classes-de-caracteres-46h6</guid>
      <description>&lt;p&gt;No último artigo iniciamos no mundo das expressões regulares. Neste presente, continuaremos a expandir nossas ferramentas para aumentar as possibilidades de &lt;em&gt;match&lt;/em&gt; falando sobre &lt;em&gt;classes de caracteres&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes de caracteres
&lt;/h2&gt;

&lt;p&gt;Classes de caracteres são usadas para podermos identificar diversos caracteres diferentes numa determinada posição. Vamos de exemplo novamente que é sempre mais fácil de explicar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Paul[ao]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Essa expressão regular descreve tanto &lt;code&gt;Paula&lt;/code&gt; quanto &lt;code&gt;Paulo&lt;/code&gt;. Isso é feito com a sintaxe &lt;code&gt;[]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando uma determinada posição pode conter mais de um caracter, usar uma classe de caracteres é a solução. Também são suportados intervalos de dígitos e caracteres, dessa maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[0-5]&lt;/code&gt; =&amp;gt; representa os dígitos de 0 a 5.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[f-j]&lt;/code&gt; =&amp;gt; representa os caracteres de &lt;em&gt;f&lt;/em&gt; a &lt;em&gt;j&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[A-Fa-f0-9]&lt;/code&gt; =&amp;gt; representa os caracteres de &lt;em&gt;a&lt;/em&gt; a &lt;em&gt;f&lt;/em&gt;, de &lt;em&gt;A&lt;/em&gt; a &lt;em&gt;F&lt;/em&gt; (regex é case sensitive, então maiúsculas e minúsculas são tratadas de maneira diferente) e os dígitos de 0 a 9. Basicamente, qualquer dígito hexadecimal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Classes de caracteres também podem incluir caracteres não-alfanuméricos. No entanto, sua utilização muda. Os únicos caracteres entendidos como especiais dentro de uma classe de caracteres são o &lt;code&gt;]&lt;/code&gt;, pois significa o fim da classe, &lt;code&gt;^&lt;/code&gt; no começo da classe, pois significa negação (mais informações à frente) e &lt;code&gt;-&lt;/code&gt;, pois indica que estamos falando de um intervalo. Dessa maneira, qualquer caracter que não os citados anteriormente é entendido como literal dentro de classes de caracteres.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Abc[*+]&lt;/code&gt; =&amp;gt; identifica os textos Abc* e Abc+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para usar os outros três caracteres (&lt;code&gt;]&lt;/code&gt;, &lt;code&gt;^&lt;/code&gt; e &lt;code&gt;-&lt;/code&gt;), é necessário escapá-los.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[a-f]&lt;/code&gt; =&amp;gt; identifica os caracteres de &lt;em&gt;a&lt;/em&gt; a &lt;em&gt;f&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[a\-f]&lt;/code&gt; =&amp;gt; identifica os caracteres &lt;em&gt;a&lt;/em&gt;, &lt;em&gt;-&lt;/em&gt; e &lt;em&gt;f&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você desejar que a classe de caracteres represente caracteres que &lt;em&gt;não&lt;/em&gt; podem ser identificados, utilize o caracter &lt;code&gt;^&lt;/code&gt; no começo da classe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[^abc]&lt;/code&gt; =&amp;gt; identifica qualquer caracter que não os caracteres &lt;em&gt;a&lt;/em&gt;, &lt;em&gt;b&lt;/em&gt; e &lt;em&gt;c&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[^0-9]&lt;/code&gt; =&amp;gt; identifica qualquer caracter que não seja um dígito&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cautela
&lt;/h2&gt;

&lt;p&gt;É importante ressaltar que classes de caracteres negados ainda assim precisam dar match num caracter. A regex &lt;code&gt;a[^f]&lt;/code&gt; não quer dizer "Letra 'a' não seguida da letra 'f'", mas fim "Letra 'a' seguida por um caracter que não seja a letra 'f'". E qual é a diferença?&lt;/p&gt;

&lt;p&gt;A regex &lt;code&gt;a[^f]&lt;/code&gt; dá match na letra 'a' em &lt;code&gt;Teresa.&lt;/code&gt;, porque o caracter '.' não é 'f', mas não dá match na letra a em &lt;code&gt;Teresa&lt;/code&gt;, pois não há nenhum caracter depois do 'a'.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Sem conclusão dessa vez ^^. Até a próxima parte&lt;/p&gt;

</description>
      <category>regex</category>
      <category>beginners</category>
      <category>expressoesregulares</category>
      <category>pcre</category>
    </item>
    <item>
      <title>Expressões Regulares I - o básico</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Tue, 30 Aug 2022 01:46:34 +0000</pubDate>
      <link>https://dev.to/feministech/expressoes-regulares-i-o-basico-3a3j</link>
      <guid>https://dev.to/feministech/expressoes-regulares-i-o-basico-3a3j</guid>
      <description>&lt;p&gt;&lt;code&gt;\d{3}\.?\d{3}\.?\d{3}-?\d{2}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Não, seu navegador não está com problemas de encoding e nem aconteceu do meu gato deitar no meu teclado. Esse monte de caracteres que parecem jogados aleatoriamente é um exemplo de &lt;strong&gt;expressão regular&lt;/strong&gt;.&lt;br&gt;
Expressões regulares, que a partir desse ponto serão chamadas de &lt;strong&gt;regexes&lt;/strong&gt; (singular, &lt;strong&gt;regex&lt;/strong&gt;) são conjuntos de caracteres que descrevem um padrão que será buscado num texto. Um exemplo vai deixar mais claro.&lt;/p&gt;

&lt;p&gt;Considere o seguinte texto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A história de toda a sociedade até aqui é a história de lutas de classes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você quiser extrair a palavra &lt;code&gt;classes&lt;/code&gt; desse texto você pode usar a seguinte regex.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;classes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Okay, não é muito útil, mas regexes podem fazer mais que isso. Pegue o exemplo a seguir:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Guerra Austríaco-Prusiana de 1866. O problema desta guerra foi discutido nas reuniões do Conselho Geral da Internacional Operária, celebrada nos dias 19 e 26 de junho, e 17 de julho de 1866 de julho. [Nota do MIA].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você quiser extrair todos os números desse texto você pode usar a seguinte regex.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\d+&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Descrevendo o que está acontecendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\d&lt;/code&gt; descreve um dígito (0, 1, 2, ..., 9)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; descreve que o símbolo anterior pode aparecer 1 ou mais vezes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessa maneira, qualquer grupo de dígitos será encontrado. No caso do texto anterior, as seguintes informações serão encontradas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1866&lt;/li&gt;
&lt;li&gt;19&lt;/li&gt;
&lt;li&gt;26&lt;/li&gt;
&lt;li&gt;17&lt;/li&gt;
&lt;li&gt;1866&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com esse segundo exemplo podemos ver um pouco melhor pra que servem regexes. Agora que passamos por isso, vamos começar do começo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O começo
&lt;/h2&gt;

&lt;p&gt;Nesse primeiro artigo vamos falar sobre &lt;em&gt;caracteres literais&lt;/em&gt;, &lt;em&gt;caracteres especiais&lt;/em&gt; e &lt;em&gt;quantificadores&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caracteres Literais
&lt;/h3&gt;

&lt;p&gt;Como descrevemos acima, caracteres literais são caracteres que são encontrados literalmente. Então se houver qualquer caracter literal na regex, ele será procurado literalmente.&lt;br&gt;
E quais são esses caracteres literais? Bom, são todos os caracteres que não são especiais. Vamos a eles, então?&lt;/p&gt;

&lt;h3&gt;
  
  
  Caracteres Especiais
&lt;/h3&gt;

&lt;p&gt;Os caracteres especiais são caracteres que tem algum uso especial, como representar repetição, caracter opcional ou outras coisas.&lt;br&gt;
O primeiro caracter especial que discutiremos é o caracter &lt;code&gt;\&lt;/code&gt;, chamado comumente de &lt;strong&gt;contra-barra&lt;/strong&gt;. Esse caracter faz com que o próximo caracter passe a ser especial se for literal e literal se for especial. Vejamos alguns exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\d&lt;/code&gt; =&amp;gt; &lt;code&gt;d&lt;/code&gt; é um caracter literal, mas precedido de &lt;code&gt;\&lt;/code&gt;, passa a significar qualquer dígito&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\+&lt;/code&gt; =&amp;gt; &lt;code&gt;+&lt;/code&gt; é um caracter especial, mas precedido de &lt;code&gt;\&lt;/code&gt; (também chamado de "escapado"), passa a significar &lt;code&gt;+&lt;/code&gt; literalmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outros caracteres especiais são &lt;code&gt;.&lt;/code&gt;, que representa qualquer caracter (exceto quebra de linha), &lt;code&gt;?&lt;/code&gt;, que diz que o símbolo anterior é opcional, entre outros. Para uma lista mais completa dos caracteres especiais mais comuns nas engines de regex, &lt;a href="https://www.regular-expressions.info/refcharacters.html" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quantificadores
&lt;/h3&gt;

&lt;p&gt;Quantificadores são úteis para evitar repetições na regex. Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\d{4}&lt;/code&gt; é o mesmo que &lt;code&gt;\d\d\d\d&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Há alguns tipos de quantificadores. Eles são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; significa que o símbolo anterior pode repetir 0 ou mais vezes (ou seja, &lt;code&gt;ab*&lt;/code&gt; identifica tanto &lt;code&gt;a&lt;/code&gt; quando &lt;code&gt;ab&lt;/code&gt;, &lt;code&gt;abb&lt;/code&gt;, &lt;code&gt;abbbb&lt;/code&gt;, etc...)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; significa que o símbolo anterior pode repetir 1 ou mais vezes (ou seja, &lt;code&gt;ab+&lt;/code&gt; identifica tanto &lt;code&gt;ab&lt;/code&gt;, &lt;code&gt;abb&lt;/code&gt;, &lt;code&gt;abbbb&lt;/code&gt;, etc..., mas não &lt;code&gt;a&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;{a,} significa que o símbolo anterior pode repetir &lt;strong&gt;a&lt;/strong&gt; ou mais vezes&lt;/li&gt;
&lt;li&gt;{,a} significa que o símbolo anterior pode repetir de 0 a &lt;strong&gt;a&lt;/strong&gt; vezes&lt;/li&gt;
&lt;li&gt;{a,b} significa que o símbolo anterior pode repetir de &lt;strong&gt;a&lt;/strong&gt; a &lt;strong&gt;b&lt;/strong&gt; vezes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?&lt;/code&gt; significa que o símbolo anterior pode ocorrer 0 ou 1 vez&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A regex do começo
&lt;/h3&gt;

&lt;p&gt;Agora você deve ser capaz de entender a regex do começo.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\d{3}\.?\d{3}\.?\d{3}-?\d{2}&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\d{3}&lt;/code&gt; =&amp;gt; 3 dígitos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\.?&lt;/code&gt; =&amp;gt; um caracter &lt;code&gt;.&lt;/code&gt; opcional&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-?&lt;/code&gt; =&amp;gt; um caracter &lt;code&gt;-&lt;/code&gt; opcional&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\d{2}&lt;/code&gt; =&amp;gt; 2 dígitos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessa forma, essa regex identifica números com formato igual ao de CPFs num texto (validação não é feita nesse caso.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Expressões regulares são uma ferramenta muito útil para processamento de textos, tanto para validação quanto para busca de informações. Apesar de ser recomendada cautela em seu uso pois o processamento de expressões regulares pode ser bastante complexo, no sentido computacional do termo, devido a uma estratégia chamada de &lt;em&gt;backtracking&lt;/em&gt;, sobre a qual falaremos numa parte futura, regex é uma das ferramentas fundamentais no cinto de utilidades do profissional de tecnologia.&lt;/p&gt;

&lt;p&gt;Nos vemos na próxima parte.&lt;/p&gt;

</description>
      <category>regex</category>
      <category>beginners</category>
      <category>expressoesregulares</category>
      <category>pcre</category>
    </item>
    <item>
      <title>Quem é a Lissa?</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Sat, 27 Aug 2022 18:44:46 +0000</pubDate>
      <link>https://dev.to/feministech/quem-e-a-lissa-1o5f</link>
      <guid>https://dev.to/feministech/quem-e-a-lissa-1o5f</guid>
      <description>&lt;h2&gt;
  
  
  Quem é Lissa para você?
&lt;/h2&gt;

&lt;p&gt;Lissa é um pedaço de um todo. A parte compreensível de um mar de ideias, pensamentos, emoções, razões, traumas, e personalidades, que tá há 15 anos nessa terra com esse mesmo corpo. Tenta todo dia lutar contra seus medos e falhas, e se lapida, tirando o montante, pra sobrar o restante que vale a pena, em busca de se tornar um rubí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quem é Lissa para o mundo?
&lt;/h2&gt;

&lt;p&gt;Uma pessoa que faz várias coisas, e não sabe decidir qual vai fazer, então é organizadora, líder de comunidade, produtora de conteúdo, desenvolvedora, influencer e peso chumbo nas treta do twitter. &lt;/p&gt;

&lt;h2&gt;
  
  
  O quê a Lissa faz atualmente?
&lt;/h2&gt;

&lt;p&gt;Eu trabalho em comunidades, produzindo conteúdo, e organizando eventos, também trabalho com a Letícia Silva, e o William Frantz, em um projeto de preparo para vagas na tecnologia remunerado, então eu também desenvolvo e produzo conteúdo lá.&lt;/p&gt;

&lt;p&gt;Não gosto de falar disso publicamente porque é uma fraqueza minha, mas é importante falar disso, então eu tenho que lidar com uma vida dupla. No colégio e em casa eu sou uma pessoa, e na internet, nos meus ambientes, eu sou outra. Em um momento eu uso uma armadura de ferro e lixa, que cansa meu corpo, e machuca a minha pele, e em outro eu não preciso usar esses proteções, mas me torno muito vulnerável e frágil.&lt;/p&gt;

&lt;p&gt;Eu sei quando isso tudo isso vai mudar, mas eu ainda preciso esperar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como é ser tão influente nas comunidades tendo 15 anos?
&lt;/h2&gt;

&lt;p&gt;Sinceramente, eu não gosto. Eu entendo a intenção positiva de me chamar de prodígio ou muito jovem, mas eu não gosto. Eu só sou assim porque quando criança eu tinha vergonha de brincar, eu convivia com os adultos, e não falava com as outras crianças, então eu tentava me espelhar neles. Então desde cedo eu apaguei minha infantilidade, e comecei a fazer coisas que não eram da minha idade, como organizar comunidades, e lidar com pessoas que tem até mais que o dobro da minha idade.&lt;/p&gt;

&lt;p&gt;Então no fim, pra mim é normal porque eu me acostumei, mas olhando pra trás, não acho bom porque tem toda uma parte da minha vida que eu perdi e que eu nunca vou ter de volta, exatamente por ter amadurecido tão cedo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que fez você se interessar por tecnologia?
&lt;/h2&gt;

&lt;p&gt;A falta do que fazer. Eu tinha uns 12 anos, e tinha passado por um período muito merda da minha vida, tanto que com 11 eu quase me matei, era questão de um passo. Então como eu não tinha nada mesmo, a tecnologia apareceu pra mim como um vídeo recomendado no Youtube, um tutorial de Python. E eu prestei atenção naquela thumbnail em específico, cliquei, me interessei, e tamo aí hoje em dia.&lt;/p&gt;

&lt;p&gt;É por isso que eu não acho que as coisas são aleatórias, elas sempre tem um motivo para acontecerem. Se não fosse aquele exato vídeo, ter sido recomendado pra mim, naquele dia, eu provavelmente nem estaria aqui mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  O quê são comunidades para você?
&lt;/h2&gt;

&lt;p&gt;Comunidades são espaços de convivência, respeito, troca de ideias e transmissão de conhecimento. Onde podemos encontrar pessoas parecidas com a gente, e chamar outras pessoas para dentro desse ambiente, botando todas essas pessoas juntas em um mesmo lugar, caminhando juntes em busca da revolução.&lt;/p&gt;

&lt;p&gt;A organização é única forma de minorias sociais, que também são massas demográficas, mudarem algo no mundo. Como um dia, em uma música ainda sem nome vou cantar:&lt;/p&gt;

&lt;p&gt;macho cishet só se for com latéx&lt;br&gt;
pensei e escrevi essa no LaTeX&lt;/p&gt;

&lt;h2&gt;
  
  
  Como você conheceu as comunidades de tecnologia?
&lt;/h2&gt;

&lt;p&gt;Conheci elas com as lives da Twitch. Eu assistia muito a live do Pokemaobr, e nela a gente começou a formar uma comunidade conforme o tempo, que é a Caverna do Patocórnio. Junto com a Caverna, as mulheres que participavam das lives formaram a Live Coder Girls, que era um grupo de mulheres que faziam ou gostavam de lives. Que depois de um tempo se tornou a Feministech, e quando eu me descobri trans no fim de 2021, eu entrei na comunidade, e depois disso eu só me senti melhor. Achar um grupo que te aceita do jeitinho que você é, é bom demais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como foi fundar a Kotlinautas?
&lt;/h2&gt;

&lt;p&gt;Foi uma experiência interessante, eu tinha começado a estudar Kotlin uma semana antes de confundar uma comunidade SOBRE KOTLIN, então eu aprendi enquanto eu produzia e construia a comunidade. É por isso que tem tanto artigo na Kotlinautas feito por mim, porque enquanto eu aprendia, eu produzia conteúdo sobre o que eu tava aprendendo.&lt;/p&gt;

&lt;p&gt;Pra ser sincera, eu tô meio desanimada da Kotlinautas pela falta de participação de todes, principalmente de mulheres ou pessoas trans lá. E se tem uma coisa que eu não curto é falta de participação ou engajamento. Mas acontece, diferentes comunidades vão ter engajamentos diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais são seus sonhos?
&lt;/h2&gt;

&lt;p&gt;Conseguir tornar a vida mais confortável pro máximo de pessoas, principalmente mulheres e pessoas trans, que eu puder. Tanto em tech, quanto em outras áreas (vem aí Fundação Lissa 👀).&lt;/p&gt;

&lt;p&gt;Eu já achei tantas vezes que a minha vida não valia a pena, que um dos meus maiores desejos é poder perto da minha morte, poder relaxar, e admirar a gota de vida que eu bebi durante aquele tempo. Que a minha passagem nessa terra dessa vez tivesse valido realmente à pena, e que eu fui útil pra alguém. Só nesse momento, eu vou me tornar o rubí que eu tanto falo sobre. Mas por enquanto, enquanto grafite, não vou parar de correr.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como customizar o prompt do seu terminal</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Sat, 18 Jun 2022 02:37:09 +0000</pubDate>
      <link>https://dev.to/feministech/como-customizar-o-prompt-do-seu-terminal-86l</link>
      <guid>https://dev.to/feministech/como-customizar-o-prompt-do-seu-terminal-86l</guid>
      <description>&lt;p&gt;Salve, salve, camaradas!&lt;br&gt;
Para quem usa Linux ou Mac o terminal é uma visão muito comum e familiar. Estamos acostumados a ver coisas como essa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;patricia@patricia-PC:~$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comum, certo? Nome do usuário, nome do host e diretório atual. No entanto, você sabia que seu prompt poderia ser assim?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Se liga no comando muito louco que patricia vai rodar agora! &amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você não sabia, vem comigo!&lt;/p&gt;

&lt;h3&gt;
  
  
  Variáveis de ambiente que controlam o prompt
&lt;/h3&gt;

&lt;p&gt;Há 4 variáveis de ambiente que configuram o prompt&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PS1&lt;/strong&gt;: Essa variável vai definir o que vai aparecer no prompt padrão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PS2&lt;/strong&gt;: Essa variável vai definir o que vai aparecer quando seu comando tiver múltiplas linhas (por exemplo num comando &lt;code&gt;for&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PS3&lt;/strong&gt;: Essa variável vai definir o que vai aparecer quando você usar o comando &lt;code&gt;select&lt;/code&gt;. Não se preocupe muito com essa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PS4&lt;/strong&gt;: Essa variável vai definir o que vai ser mostrado quando o bash for instruído a mostrar o stack trace de um comando. Não se preocupe muito com essa também.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessas variáveis, as que mais serão usadas são as PS1 e PS2, e a primeira muito mais que a segunda.&lt;/p&gt;

&lt;p&gt;Bora customizar??&lt;/p&gt;

&lt;h3&gt;
  
  
  Customizando o prompt
&lt;/h3&gt;

&lt;p&gt;Em primeiro lugar, não fique com medo de "zoar" seu prompt. Qualquer mudança que você fizer é reversível.&lt;/p&gt;

&lt;p&gt;Agora que estamos sem medo, vamos colocar a data atual no prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;patricia@patricia-PC:~$ PS1="\t $PS1"
20:00:05 patricia@patricia-PC:~$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Que que aconteceu aí?&lt;br&gt;
Na primeira linha a gente modifica a variável &lt;code&gt;PS1&lt;/code&gt; para receber o valor &lt;code&gt;\t $PS1&lt;/code&gt;. Esse &lt;code&gt;$PS1&lt;/code&gt; será expandido para o prompt atual, que no meu caso é &lt;code&gt;\u@\h:\w\$&lt;/code&gt;. Então o prompt vai ficar &lt;code&gt;\t \u@\h:\w\$&lt;/code&gt;.&lt;br&gt;
Agora, como que &lt;code&gt;\t&lt;/code&gt; virou a data? Essa é uma "variável" interna usada pro prompt.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;\u&lt;/strong&gt; será expandido para o nome do usuário&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;\h&lt;/strong&gt; será expandido para o nome do host (até o primeiro ".")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;\w&lt;/strong&gt; será expandido para o diretório atual (substituindo &lt;code&gt;/home/${USER}&lt;/code&gt; por &lt;code&gt;~&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;\$&lt;/strong&gt; será expandido para &lt;code&gt;$&lt;/code&gt; quando o usuário for comum e &lt;code&gt;#&lt;/code&gt; quando o usuário for o "root"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;\t&lt;/strong&gt; será expandido para a data no formato HH:MM:SS (formato de 24 horas)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você não gostar do que você fez, você pode ou tentar reconstruir o PS1 anterior ou simplesmente sair e voltar para o terminal. (Se você estiver usando um emulador de terminal, basta abrir uma outra aba ou fechar e abrir de novo).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tldp.org/HOWTO/Bash-Prompt-HOWTO/index.html" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; tem uma referência boa para ler mais sobre essas configurações, mas é bastante extensa e densa, então leia com coragem. &lt;a href="https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x157.html" rel="noopener noreferrer"&gt;Essa sessão&lt;/a&gt; e &lt;a href="https://tldp.org/HOWTO/Bash-Prompt-HOWTO/bash-prompt-escape-sequences.html" rel="noopener noreferrer"&gt;essa sessão&lt;/a&gt; são as mais importantes!&lt;/p&gt;

&lt;p&gt;Se quiserem, postem seus PS1's aqui embaixo nos comentários! (se mudarem PS2, PS3 ou PS4 mandem também!)&lt;/p&gt;

&lt;p&gt;Um beijo!&lt;/p&gt;

</description>
      <category>bash</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Você conhece APL?</title>
      <dc:creator>Patrícia Villela</dc:creator>
      <pubDate>Tue, 14 Jun 2022 21:43:46 +0000</pubDate>
      <link>https://dev.to/feministech/voce-conhece-apl-24b6</link>
      <guid>https://dev.to/feministech/voce-conhece-apl-24b6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AVISO! Esse artigo contém exemplos de código. Se você quiser rodá-los, copie e cole as linhas &lt;strong&gt;identadas à direita&lt;/strong&gt; (as linhas identadas à esquerda são os resultados) nesse site: &lt;a href="https://tryapl.org" rel="noopener noreferrer"&gt;https://tryapl.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;APL é uma linguagem com certeza mais velha que muitos dos desenvolvedores de hoje em dia. Criada em 1966 por Kenneth E. Iverson, é uma das linguagens mais antigas ainda em uso hoje (mais velha que C, a propósito, e do que B também!).&lt;br&gt;
Olhando um código APL, no entanto, você pode ter várias sensações. Uma comum é de que existe algum problema de encoding te impedindo de ler o que está escrito. De qualquer maneira, sua sintaxe não se parece nada com as linguagens de sua época, ou de hoje em dia.&lt;br&gt;
Exemplo de programa em APL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⍝ média aritmética de uma lista
(+/÷≢)w
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é um programa que te retorna a média aritmética de uma lista (&lt;code&gt;w&lt;/code&gt; é a lista).&lt;br&gt;
Mas, cadê o loop para somar todos os elementos? E a divisão dessa soma pelo tamanho da lista?&lt;/p&gt;

&lt;p&gt;Essa é a magia de APL. Originalmente significando "A Programming Language", nome inspirado no livro que a introduziu, teve seu nome ressignificado para "Array Programming Language", justamente porque suas construções funcionam com dados de qualquer dimensão.&lt;/p&gt;

&lt;p&gt;Opa, pera, mas como assim dimensão? Vem comigo!&lt;/p&gt;

&lt;p&gt;Mas antes, um porém sobre a interpretação dos símbolos. Ao contrário da maior parte das linguagens de programação, APL é interpretada da direita para a esquerda.&lt;/p&gt;

&lt;p&gt;Ou seja, a expressão &lt;code&gt;10 - 5 - 2&lt;/code&gt;, em matemática tradicional, resultaria em 3. Mas em APL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      10 - 7 - 2
5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porque primeiro foi computado &lt;code&gt;7 - 2&lt;/code&gt;, resultando em 5, e depois &lt;code&gt;10 - 5&lt;/code&gt;, resultando também em 5.&lt;/p&gt;

&lt;p&gt;Agora sobre as dimensões.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dimensões
&lt;/h3&gt;

&lt;p&gt;Vejamos uma variável aqui&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⍝ definindo uma variável
      a←2
      a
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(ah, sim, variáveis não recebem seu valor usando &lt;code&gt;=&lt;/code&gt;, mas sim usando &lt;code&gt;←&lt;/code&gt;. Você acostuma rápido)&lt;/p&gt;

&lt;p&gt;A variável &lt;code&gt;a&lt;/code&gt; tem uma dimensão de 0, porque é um valor único. Você pode verificar a dimensão de uma variável usando &lt;code&gt;⍴⍴&lt;/code&gt; (não são duas letras 'p', mas sim duas letras gregas rô).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⍝ número de dimensões de uma variável escalar
      ⍴⍴a
0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se fosse uma lista, a dimensão seria 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⍝ número de dimensões de uma lista
      a←1 2 3 4 5
      ⍴⍴a
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beleza. Agora vamos somar dois valores escalares, nome de valores de dimensão 0, e duas listas (dimensão 1).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ⍝ soma entre dois escalares e duas listas
      a←1
      b←2
      a+b
3
      a←1 2 3 4 5
      b←6 7 8 9 10
      a+b
7 9 11 13 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que a sintaxe é a mesma para somar escalares ou listas.&lt;br&gt;
É sobre isso que falo quando digo que as construções de APL são feitas para funcionar com diferentes dimensões. Por isso o exemplo da média aritmética acima não precisa de loop. O loop é intrínseco à linguagem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tá, mas e daí?
&lt;/h3&gt;

&lt;p&gt;Claro, é muito legal isso, mas e daí? Por que eu usaria essa linguagem quando eu poderia fazer a mesma coisa com outra?&lt;/p&gt;

&lt;p&gt;Há uma série de vantagens em usar APL, principalmente se você precisa lidar com muitos dados (arrays).&lt;/p&gt;

&lt;p&gt;Vamos pegar um exemplo do &lt;a href="https://adventofcode.com/" rel="noopener noreferrer"&gt;Advent of Code de 2021&lt;/a&gt;.&lt;br&gt;
Se você quiser ler todo o problema, accesse &lt;a href="https://adventofcode.com/2021/day/1" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema&lt;/strong&gt;&lt;br&gt;
Há uma lista de leituras de profundidade do oceano e você precisa contar quantas vezes a profundidade aumenta. Ou seja, das leituras, deve-se contar toda vez que uma leitura é maior que a anterior.&lt;/p&gt;

&lt;p&gt;Vamos fazer uma solução em Java (sem todo o boilerplate, embora ele exista)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public int contarDescidas(int[] leituras) {
    int leituraAnterior = 0;
    int totalDescidas = 0;
    for(int i = 0; i &amp;lt; leituras.length; i++) {
        if(leituras[i] &amp;gt; leituraAnterior) {
            totalDescidas++;
        }
        leituraAnterior = leituras[i];
    }
    return totalDescidas;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora em APL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{+/0&amp;gt;2-/⍵}leituras
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso que eu nem me preocupei em como os dados seriam de fato lidos, o que é toda uma parada complicada no Java, e em APL é isso aqui&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;leituras←⍎⍤1⊢↑⊃⎕NGET'arquivo'1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parece complicado mas é muito claro quando se conhece o que cada símbolo faz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;O objetivo desse artigo foi dar um gostinho do que APL é capaz. Eu não tenho nem de longe a expertise de outras pessoas que podem falar mais sobre essa linguagem.&lt;/p&gt;

&lt;p&gt;Uma delas é o Rodrigo Girão Serrão. Ele é um desenvolvedor português que está trabalhando para reescrever o livro "Mastering Dyalog APL" (Dyalog APL é uma implementação da linguagem). O canal dele no YouTube é &lt;a href="https://www.youtube.com/channel/UCd_24S_cYacw6zrvws43AWg" rel="noopener noreferrer"&gt;esse aqui&lt;/a&gt;&lt;br&gt;
O canal code_report também faz vídeos comparando APL com outras linguagens. Link &lt;a href="https://www.youtube.com/c/codereport/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se você quiser já mergulhar no mundo da APL, pode ler online de maneira gratuita o livro "Mastering Dyalog APL", a &lt;a href="https://www.dyalog.com/uploads/documents/MasteringDyalogAPL.pdf" rel="noopener noreferrer"&gt;versão antiga&lt;/a&gt; ou a &lt;a href="https://mastering.dyalog.com/README.html" rel="noopener noreferrer"&gt;versão nova&lt;/a&gt; (ainda em fase de desenvolvimento).&lt;/p&gt;

&lt;p&gt;É isso então. Espero que vocês tenham gostado. Até mais!&lt;/p&gt;

</description>
      <category>apl</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>uncommon</category>
    </item>
  </channel>
</rss>
