<?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: Eduardo Teixeira</title>
    <description>The latest articles on DEV Community by Eduardo Teixeira (@dunirvana).</description>
    <link>https://dev.to/dunirvana</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%2F241501%2Ff66f6684-1499-4b98-9828-bdbfba7238e8.jpeg</url>
      <title>DEV Community: Eduardo Teixeira</title>
      <link>https://dev.to/dunirvana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dunirvana"/>
    <language>en</language>
    <item>
      <title>Clojure - Símbolos globais e locais</title>
      <dc:creator>Eduardo Teixeira</dc:creator>
      <pubDate>Fri, 18 Feb 2022 18:20:00 +0000</pubDate>
      <link>https://dev.to/dunirvana/clojure-simbolos-globais-e-locais-482g</link>
      <guid>https://dev.to/dunirvana/clojure-simbolos-globais-e-locais-482g</guid>
      <description>&lt;p&gt;Até agora, sempre que foi necessário manter um valor em memória nós usamos o conceito de "variável", realizando a "definição de um símbolo" com o comando "def". Porém essa abordagem corresponde ao que conhecemos nas linguagens mais tradicionais como "definição de variável global".&lt;/p&gt;

&lt;p&gt;Como é de conhecimento, as definições de "variáveis globais" podem trazer uma série de problemas as aplicações, uma vez que é quase impossível ter conhecimento de todas, com isso podemos acabar gerando problemas com a substituição de valores durante seu uso, podendo causar erros em diversos pontos da aplicação e tornando a aplicação instável e de difícil manutenção.&lt;/p&gt;

&lt;p&gt;Dito isso, veremos como trabalhar com símbolos dentro de um escopo limitado, seguiremos os próximos exemplos dentro de nossas funções.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo global
&lt;/h2&gt;

&lt;p&gt;Como vimos até aqui, os símbolos de escopo global podem ser acessados de qualquer parte da aplicação, vamos ao exemplo, considerando uma aplicação hipotética de uma escola, temos duas rotinas distintas que mostram a média dos alunos em duas condições distintas:&lt;/p&gt;

&lt;p&gt;Uma que mostra e média "padrão" acrescida de um ponto extra;&lt;br&gt;
Outra que mostra a média do aluno em uma condição de "recuperação", que acresce a média dois pontos extras;&lt;br&gt;
Enquanto a rotina que mostra a média "padrão" olha para um símbolo global para fazer seu cálculo sem fazer qualquer alteração a rotina que mostra a média dos alunos em condição de "recuperação" também utiliza o mesmo símbolo global, porém ela sempre altera seu valor para "dois".&lt;/p&gt;

&lt;p&gt;O problema que teremos é o seguinte, enquanto a rotina que mostra as médias de alunos em "recuperação" não for executada a rotina de média "padrão", quando executada, apresentará um resultado correto, porém após primeira execução da rotina de "recuperação" a "padrão" começará a mostrar um resultado errado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def ponto-extra 1)

(defn verifica-situacao-aluno-padrao
  "Retorna a media do aluno somada a seu ponto extra"
  [nota1 nota2]
  (+ (/ (+ nota1 nota2) 2) ponto-extra)
)
(defn verifica-situacao-aluno-recuperacao
  "Retorna a media do aluno somada a seu ponto extra (em caso de recuperação)"
  [nota1 nota2]
  (def ponto-extra 2)
  (+ (/ (+ nota1 nota2) 2) ponto-extra)
)

ponto-extra
(verifica-situacao-aluno-padrao 5 5)
(verifica-situacao-aluno-recuperacao 5 5)
(verifica-situacao-aluno-padrao 5 5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqoy2v7g149g7pywu7md.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqoy2v7g149g7pywu7md.png" alt="Exemplificando um problema com símbolo global"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sobre a imagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha três definimos nosso símbolo global "ponto-extra";&lt;/li&gt;
&lt;li&gt;Da linha cinco até a linha dezesseis definimos nossas duas funções, "padrão" e "recuperação" respectivamente;&lt;/li&gt;
&lt;li&gt;Na linha dezenove checamos o valor do nosso símbolo global "ponto-extra", que é "1";&lt;/li&gt;
&lt;li&gt;Na linha vinte e um consultamos a situação de um aluno com a rotina "padrão" e vemos que sua média é "6";&lt;/li&gt;
&lt;li&gt;Na linha vinte e três consultamos a situação de um aluno com a rotina de "recuperação" e vemos que sua média é "7";&lt;/li&gt;
&lt;li&gt;Na linha vinte e cinco consultamos a situação de um aluno com a rotina "padrão" novamente e agora vemos um resultado diferente, sua média passou a ser "7", mesmo valor que a rotina de "recuperação";&lt;/li&gt;
&lt;li&gt;Na linha vinte e sete checamos o valor do nosso símbolo global "ponto-extra" novamente, e conforme esperado ele agora é "2";&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conforme já explicado, a função de "recuperação" altera o valor do símbolo global que é usado por outras funções, essa mudança não era esperada em outras partes da aplicação e isso gerou um problema de divergência de valores, e pior, a momentos onde o problema não ocorre (já que ele só ocorre a partir da primeira execução da rotina de "recuperação") e a rotinas que continuam a funcionar (a rotina "recuperação" sempre funciona). Acabamos de gerar um bug em nossa aplicação que não será nada fácil de simular/encontrar/corrigir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo local
&lt;/h2&gt;

&lt;p&gt;Como visto anteriormente, o uso inadequado de um símbolo global gerou um bug em nossa aplicação, para resolver esse problema o desenvolvedor que criou a função de "recuperação" deveria ter usado um símbolo de escopo local na rotina, uma vez que o valor de "ponto-extra" usado ali é uma regra especifica dessa rotina.&lt;/p&gt;

&lt;p&gt;Para trabalharmos com o escopo local utilizaremos a função "let", com ele criamos um escopo local com símbolos e funções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O "let" deve ser usado entre parênteses;&lt;/li&gt;
&lt;li&gt;Ele recebe um vetor de símbolos/valores;&lt;/li&gt;
&lt;li&gt;Ele recebe uma ou mais funções;&lt;/li&gt;
&lt;li&gt;Ele retorna o resultado da execução de sua última função;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(let [idade 40] (+ idade 1))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafdrv4w30zcz3u5m4xuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafdrv4w30zcz3u5m4xuw.png" alt="Usando o let pela primeira vez"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha um criamos nosso escopo local com o "let", nesse escopo temos o símbolo "idade" com o valor "40" dentro do vetor e temos uma função que soma a valor "1" ao nosso símbolo "idade";&lt;/li&gt;
&lt;li&gt;Na linha dois temos o resultado da função de soma;&lt;/li&gt;
&lt;li&gt;Na linha três tentamos usar o símbolo "idade" e recebemos um erro na sequencia dizendo que não foi possível resolver o símbolo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bom, agora que já sabemos como resolver o problema de escopo vamos aplicar uma correção em nossa função "recuperação", para que ela deixe de usar o símbolo global, primeiro vamos reiniciar o símbolo global para seu valor correto, em seguida vamos corrigir a função e ne sequencia executar os testes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def ponto-extra 1)

(defn verifica-situacao-aluno-recuperacao
  "Retorna a media do aluno somada a seu ponto extra (em caso de recuperação)"
  [nota1 nota2]
  (let [ponto-extra-recuperacao 2]
    (+ (/ (+ nota1 nota2) 2) ponto-extra-recuperacao))  
)

(verifica-situacao-aluno-padrao 5 5)
(verifica-situacao-aluno-recuperacao 5 5)
(verifica-situacao-aluno-padrao 5 5)
ponto-extra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4i6ciqsv6lfc67tzkfu5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4i6ciqsv6lfc67tzkfu5.png" alt="Refatorando a função para uso do escopo local"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha 1 redefinimos nosso símbolo global para seu valor correto;&lt;/li&gt;
&lt;li&gt;Da linha três até a oito temos a refatoração de nossa função com o uso do "let";&lt;/li&gt;
&lt;li&gt;Nas linhas dez, doze e catorze repetimos os testes, e agora os seus respectivos resultados estão corretos;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Nesse post entendemos e exemplificamos os problemas causados pelo uso do escopo global, vimos como trabalhar com escopo local com o "let" e refatoramos nossa função problemática para que nossa aplicação voltasse a funcionar da forma esperada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saiba mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clojure.org/" rel="noopener noreferrer"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clojure.org/about/functional_programming" rel="noopener noreferrer"&gt;Functional Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://programero.blogspot.com/2022/02/clojure-simbolos-globais-e-locais.html" rel="noopener noreferrer"&gt;Escrito originalmente aqui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clojure</category>
      <category>functional</category>
      <category>braziliandevs</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Clojure - Criando nossa primeira função</title>
      <dc:creator>Eduardo Teixeira</dc:creator>
      <pubDate>Wed, 09 Feb 2022 17:26:29 +0000</pubDate>
      <link>https://dev.to/dunirvana/clojure-criando-nossa-primeira-funcao-1cdj</link>
      <guid>https://dev.to/dunirvana/clojure-criando-nossa-primeira-funcao-1cdj</guid>
      <description>&lt;p&gt;Anteriormente vimos como configurar o ambiente e em seguida escrevemos nossas primeiras linhas de código para começarmos a entender como o Clojure funciona, usamos algumas funções "nativas", declaramos algumas "variáveis" e também brincamos com um vetor.&lt;/p&gt;

&lt;p&gt;Nesse post daremos mais um passo, escreveremos nossa primeira função, passando por algumas de suas características e entendendo um pouco sobre como a criação delas funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo nossa primeira função
&lt;/h2&gt;

&lt;p&gt;Para criar nossa primeira função precisamos ter em mente que o que deve ser feito é algo semelhante a definição de uma variável, a diferença fica por conta do uso do comando "defn" (é possível usar o "def", mas veremos isso futuramente), basicamente precisaremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escrever todo o conteúdo dentro de parênteses;&lt;/li&gt;
&lt;li&gt;Usar o comando "defn";&lt;/li&gt;
&lt;li&gt;Definir uma lista de parâmetros, se não existirem parâmetros (nosso caso agora) essa lista deve estar vazia;&lt;/li&gt;
&lt;li&gt;Definir o corpo da função;&lt;/li&gt;
&lt;li&gt;Opcionalmente podemos colocar um comentário para deixar mais claro o que a função faz;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Definindo nossa função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn minha-primeira-funcao
  "Exemplo de uma função"
  []
  (println "Minha primeira função!")
)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando nossa função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(minha-primeira-funcao)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwyra48854iybxuxa8ci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwyra48854iybxuxa8ci.png" alt="Criando nossa primeira função!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha três temos o inicio da definição de nossa função com o uso de "defn" seguido do nome que escolhemos;&lt;/li&gt;
&lt;li&gt;Na linha quatro, entre aspas duplas, temos o comentário que explica o que a função faz;&lt;/li&gt;
&lt;li&gt;Na linha cinco temos o vetor de parâmetros vazio;&lt;/li&gt;
&lt;li&gt;Na linha seis temos o corpo de nossa função, que realiza a impressão no console de uma frase;&lt;/li&gt;
&lt;li&gt;Na linha sete temos o fechamento de nossa função;&lt;/li&gt;
&lt;li&gt;Na linha nove executamos a nossa função;&lt;/li&gt;
&lt;li&gt;Na linha dez temos o resultado da execução e na onze o retorno;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apenas um detalhe, a função toda foi escrita no bloco de notas, e depois copiada para o console para a execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando uma função que recebe parâmetros e devolve um valor
&lt;/h2&gt;

&lt;p&gt;De acordo com nosso exemplo anterior, para criarmos uma função que receba parâmetros basta declara-los no vetor que tem essa responsabilidade, agora para retornar um valor basta construirmos uma instrução que retorne um valor.&lt;/p&gt;

&lt;p&gt;Para nosso segundo exemplo criaremos uma função que calculará e retornará a média de um aluno com base em duas notas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn calcula-media
  "Calculando a media de duas notas"
  [nota1, nota2]
  (/ (+ nota1 nota2) 2)
)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando nossa segunda função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(calcula-media 7M 8M)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoghpasrl4jqhd68whv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoghpasrl4jqhd68whv6.png" alt="Função que calcula a média de duas notas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Da linha três a linha sete temos a definição de nossa função, destaque para a linha cinco onde temos a definição de dois parâmetros (nossas duas notas) e para a linha seis, onde de fato realizamos o cálculo e por consequência o retorno da média, analisando de "dentro" para "fora" temos a soma das notas e depois a divisão por dois;&lt;/li&gt;
&lt;li&gt;Na linha nove temos a execução da função de média, onde informamos as duas notas, a "letra M" colocada junto do valor das notas é apenas para termos um resultado mais amigável, a frente entenderemos melhor a questão de tipos de dados;&lt;/li&gt;
&lt;li&gt;E na linha dez temos o resultado apresentado, a média calculada;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Nesse post escrevemos nossas duas primeiras funções e entendemos como passar parâmetros e devolver um resultado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saiba mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clojure.org/" rel="noopener noreferrer"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clojure.org/guides/learn/functions" rel="noopener noreferrer"&gt;Learn Clojure - Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://programero.blogspot.com/2022/02/clojure-criando-nossa-primeira-funcao.html" rel="noopener noreferrer"&gt;Escrito originalmente aqui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clojure</category>
      <category>functional</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Clojure - Funções, vetores e def</title>
      <dc:creator>Eduardo Teixeira</dc:creator>
      <pubDate>Mon, 07 Feb 2022 12:28:47 +0000</pubDate>
      <link>https://dev.to/dunirvana/clojure-funcoes-vetores-e-def-4133</link>
      <guid>https://dev.to/dunirvana/clojure-funcoes-vetores-e-def-4133</guid>
      <description>&lt;p&gt;Nessa postagem escreveremos nossas primeiras linhas de código com o Clojure, aqui tentaremos trazer alguns conceitos para mais perto de quem já programa com os paradigmas mais tradicionais (orientação a objetos por exemplo), de modo que fique mais simples entender as intenções e começarmos a correlacionar alguns pontos, mesmo que alguns deles não sejam necessariamente a mesma coisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;

&lt;p&gt;Como já é de conhecimento, funções são pequenas partes de um programa que executam um trabalho e devolvem um resultado, e para que esse trabalho seja realizado muitas vezes é necessário informar argumentos ou informações para que algo seja feito.&lt;/p&gt;

&lt;p&gt;Em Clojure toda invocação de uma função ocorre dentro de parênteses, logo podemos interpretar o conteúdo que esta dentro dos parênteses da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O primeiro valor é a função a ser executada;&lt;/li&gt;
&lt;li&gt;O segundo valor é o primeiro argumento que a função receberá;&lt;/li&gt;
&lt;li&gt;Vamos agora ao nosso primeiro exemplo, iremos chamar uma função que escreve no console, passando como "argumento" o famoso "Olá Mundo!":
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(println "Olá Mundo!")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AMnkUIlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zoybd0a23qqi37z2r7ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AMnkUIlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zoybd0a23qqi37z2r7ob.png" alt="Nosso primeiro comando!" width="360" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos falar sobre a imagem agora, linha por linha:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na primeira linha estamos iniciando o Clojure com o comando "clj";&lt;/li&gt;
&lt;li&gt;Na segunda linha nos é apresentada a versão atual (1.10.3);&lt;/li&gt;
&lt;li&gt;Na terceira linha começamos a escrever nosso primeiro código, chamando a função "println";&lt;/li&gt;
&lt;li&gt;Na quarta linha temos o resultado da execução interna da função "println", que é a escrita no console da frase que informamos como "argumento";&lt;/li&gt;
&lt;li&gt;Na quinta linha temos o retorno da função "println", como ela não retorna nada recebemos nulo (nil);&lt;/li&gt;
&lt;li&gt;Na sexta e última linha temos o controle a disposição novamente para informar os próximos comandos;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainda sobre funções vale destacar que os operadores matemáticos também são considerados como funções, logo se quisermos somar dois números, por exemplo, precisaríamos iniciar a expressão com o operador de soma, seguido dos "argumentos" (números) que desejamos somar:&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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iniciar a a expressão com um número, utilizando um padrão de operação comum nas linguagens  de programação mais tradicionais resultaria em erro, uma vez que o Clojure tentaria interpretar um número como uma função:&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)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rg2Tpy_c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czx95bmspq1oeyau1pfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rg2Tpy_c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czx95bmspq1oeyau1pfq.png" alt="Somando dois números" width="550" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima vemos os dois exemplos, o primeiro com o resultado correto, onde a soma é o primeiro parâmetro e o segundo com o resultado incorreto, onde o Clojure nos diz que o número informado não é uma função.&lt;/p&gt;

&lt;h2&gt;
  
  
  def
&lt;/h2&gt;

&lt;p&gt;Quando estamos programando é trivial mantermos determinados valores (independente do tipo) armazenados em memória, para podermos acessá-los durante a execução de uma aplicação ou função e comumente realizamos isso por meio de "variáveis", sendo justamente esse o conceito que utilizaremos agora para tentar entender o "def".&lt;/p&gt;

&lt;p&gt;Com o "def" criamos (ou definimos) símbolos que nos permitem salvar e recuperar determinados valores, funcionando de forma semelhante a uma variável, sua sintaxe é simples, e funciona como uma função, onde temos a função propriamente dita, o símbolo a ser criado/atualizado e o valor que pretendemos associar ao símbolo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def total-de-alunos 25)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para poder ver o valor armazenado em nosso símbolo podemos usar o "println" ou podemos ver seu conteúdo simplesmente digitando o nome do símbolo (fora de parentes é claro):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(println total-de-alunos)

total-de-alunos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xg_nUtiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kuvox0l2zeuj1gmj3v4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xg_nUtiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kuvox0l2zeuj1gmj3v4t.png" alt="Definindo um símbolo e vendo seu conteúdo" width="391" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima vemos o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha três a definição do símbolo "total-de-alunos" com o valor "25";&lt;/li&gt;
&lt;li&gt;Na linha quatro o retorno que nos indica o espaço onde nosso símbolo esta gravado (user);&lt;/li&gt;
&lt;li&gt;Na linha cinco executamos a função "println" para ver o conteúdo;&lt;/li&gt;
&lt;li&gt;Na linha oito verificamos o valor do símbolo diretamente, sem o uso de uma função;&lt;/li&gt;
&lt;li&gt;Nas linhas seis e nove podemos ver o valor armazenado no símbolo;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para alterar o valor de um símbolo basta utilizarmos o "def" novamente, informando o identificador e o novo valor, esse novo valor pode ser um número fixo (como vimos anteriormente) ou pode ser a execução de uma outra função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def total-de-alunos 30)

(def total-de-alunos (+ total-de-alunos 5))

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GPNf_hz1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i7jjna7mxcr2770r0c0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GPNf_hz1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i7jjna7mxcr2770r0c0d.png" alt="Alterando o valor do símbolo" width="461" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos observar na imagem acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha um definimos um novo valor para o símbolo;&lt;/li&gt;
&lt;li&gt;Na linha três pedimos para ver o novo valor e na linha quatro o vemos (30);&lt;/li&gt;
&lt;li&gt;Na linha cinco alteramos o valor novamente, fazendo com que o novo valor seja o valor já existente "30" somado a "5";&lt;/li&gt;
&lt;li&gt;Na linha sete pedimos para ver o novo valor e na linha oito o vemos (35);&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vetores
&lt;/h2&gt;

&lt;p&gt;Quando começamos a aprender uma nova linguagem de programação umas das primeiras estruturas que aprendemos para armazenar uma série de elementos é o vetor, em Clojure não é diferente, a exemplo do que vimos anteriormente, iremos usar o "def" para definir um símbolo ficando por conta do valor atribuído a definição desse vetor, em nosso caso iremos atribuir uma série de nomes entre colchetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def alunos ["Maria", "Flávia", "Teresa"])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que no comando acima utilizamos "virgulas" para separar os elementos, mas o que conta mesmo para essa separação são os espaços, a virgula esta ali apenas como uma boa prática que nos permite identificar melhor os itens (inclusive as virgulas são consideradas como espaços no Clojure).&lt;/p&gt;

&lt;p&gt;Para ver os itens de nosso vetor podemos usar tanto as formas já vistas até aqui, com o "println" ou digitando o nome do símbolo diretamente, o que resulta na apresentação de todos os valores ou podemos acessá-los por meio de suas posições, nesse último caso o vetor acaba funcionando como uma função que recebe como parâmetro a posição desejada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(println alunos)

alunos

(alunos 2)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--38g2z8kp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/22c8jzvj67uhnwlwoukw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--38g2z8kp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/22c8jzvj67uhnwlwoukw.png" alt="Criando o vetor e vendo seu conteúdo" width="468" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando trabalhamos com vetor temos a disposição a função "count" para contar o total de elementos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(count alunos)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora se nossa intenção for adicionar um novo item ao vetor devemos usar a função "conj", aqui é muito importante entendermos que essa função não altera o vetor original, o que ela faz é retornar um novo vetor que possui os valores anteriores e também o novo, isso devido a imutabilidade do Clojure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(conj alunos "Eduardo")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas qual a vantagem da imutabilidade então? Bom ela nos garante que nossa informação (no caso os valores de nosso vetor) não serão alterados sem o nosso conhecimento ao utilizarmos outras funções, desse modo temos uma confiabilidade maior sobre a informação uma vez que ela só será alterada se realmente desejarmos, ou seja, não corremos o risco de termos os dados alterados por uma função que se quer conhecemos a implementação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fzTXm_MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzh6xf6ra2aenquubi6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fzTXm_MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzh6xf6ra2aenquubi6c.png" alt="Adicionando valor ao vetor sem alterá-lo" width="462" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na linha sete usamos a função "conj" para adicionar um elemento ao vetor;&lt;/li&gt;
&lt;li&gt;Na linha oito a função "conj" nos retorna o novo vetor contendo a alteração que realizamos;&lt;/li&gt;
&lt;li&gt;Na linha nove e dez podemos perceber que o vetor original "alunos" não foi alterado;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certo, como já é possível imaginar, se nossa intenção for alterar o vetor original precisaremos então redefinir o valor do nosso símbolo "vetor", sendo que seu novo valor será o resultado da execução da função "conj":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(def alunos (conj alunos "Eduardo"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Si9prgc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1a4oayui1byvbaf11vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Si9prgc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1a4oayui1byvbaf11vh.png" alt="Novo valor no vetor original" width="397" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver na imagem acima agora o vetor original "alunos" possui o novo valor.&lt;/p&gt;

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

&lt;p&gt;Nessa postagem sentimos o gostinho inicial do Clojure, escrevemos nosso primeiro "Olá Mundo!", definimos nossa primeira "variável" e criamos nosso primeiro vetor. Também nos deparamos com a imutabilidade, entendendo como ela funciona e uma de suas principais vantagens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saiba mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clojure.org/guides/learn/syntax"&gt;Learn Clojure - Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://programero.blogspot.com/2022/02/clojure-funcoes-vetores-e-def.html"&gt;Escrito originalmente aqui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clojure</category>
      <category>functional</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Clojure - Preparando o ambiente</title>
      <dc:creator>Eduardo Teixeira</dc:creator>
      <pubDate>Thu, 03 Feb 2022 18:56:19 +0000</pubDate>
      <link>https://dev.to/dunirvana/clojure-preparando-o-ambiente-8m</link>
      <guid>https://dev.to/dunirvana/clojure-preparando-o-ambiente-8m</guid>
      <description>&lt;p&gt;Antes de mais nada precisamos preparar nosso ambiente para podermos começar a brincar, no link oficial temos os processos de instalação de acordo com os SOs suportados, nessa postagem iremos falar sobre as instalações no Linux e no Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;

&lt;p&gt;Para a instalação no Windows podemos usar o instalador ou fazer o processo via linha de comando com o PowerShell, esse último seguindo as seguintes instruções (conforme indicado aqui):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se certificar que o PowerShell esta na versão 5 ou posterior, para tal basta abrir o mesmo (pressione "Windows + X", escolha "Executar" e digite o comando "Powershell"), e em seguida digitar o comando "get-host":&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nJqf4FVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5tanm37arc9pa8o6ng3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nJqf4FVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5tanm37arc9pa8o6ng3.png" alt="Versão do PowerShell" width="823" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Também devem estar instalados o ".NET Core SDK 2.1+ or .NET Framework 4.5+ (ou mais recente)". Além disso precisaremos do Java 8+ e a variável de ambiente JAVA_HOME configurada;&lt;/li&gt;
&lt;li&gt;Se tudo estiver certo basta executar o comando para o download "iwr -useb download.clojure.org/install/win-install-1.10.3.1058.ps1 | iex":&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QpZHwOVf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jd9630jfgr5nkcrveauo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QpZHwOVf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jd9630jfgr5nkcrveauo.png" alt="Baixando o Clojure" width="878" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como podemos ver acima, após o download nos é apresentada uma lista de possíveis locais para a instalação, no nosso caso escolheremos a opção "2":&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SlWFx7x3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gaox959fogq6yz5vohk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SlWFx7x3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gaox959fogq6yz5vohk4.png" alt="Instalando o Clojure" width="880" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se tudo correu bem até aqui temos nossa configuração inicial pronta;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Linux
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Em nosso caso estamos usando a distribuição Ubuntu 18.4;&lt;/li&gt;
&lt;li&gt;Precisamos garantir que as seguintes dependências estão instaladas: bash, curl, rlwrap e o Java (em nosso caso precisamos instalar apenas o Java,  e para tal utilizamos esse artigo);&lt;/li&gt;
&lt;li&gt;Se estiver tudo OK basta baixar um script pronto (com o curl), depois executar ele:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AiGOkarV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h1ir1dbt73173xy1opfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AiGOkarV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h1ir1dbt73173xy1opfd.png" alt="Baixando e instalando o Clojure no Linux" width="751" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Concluímos a instalação base do Clojure tanto no Windows como no Linux, nas próximas postagens começaremos nossa caminhada!&lt;/p&gt;

&lt;h2&gt;
  
  
  Saiba mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clojure.org/"&gt;Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clojure.org/guides/getting_started"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/como-instalar-o-java-com-apt-no-ubuntu-18-04-pt"&gt;Instalando o Java no Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://programero.blogspot.com/2022/02/clojure-preparando-o-ambiente.html"&gt;Escrito originalmente aqui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>clojure</category>
      <category>functional</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
