DEV Community

Guilherme Rodrigues de Melo
Guilherme Rodrigues de Melo

Posted on

Começando com Clojure

O que é Clojure?

Clojure é um dialeto de Lisp, que é uma linguagem de programação funcional. Clojure roda na JVM (Java Virtual Machine), possui uma sintaxe um tanto quanto peculiar e simples. Por poder ser executada na JVM, programas escritos em Clojure pode fazer uso de bibliotecas Java.

Mas o que é uma programação funcional?

Programação funcional é um paradigma de programação, ou seja, é uma forma de se programar. Este paradigma é baseado em um modelo computacional chamado Cálculo Lambda, criado por Alonzo Church em 1930. Em programação funcional tudo é função, ou seja, um código funcional é uma sequência de funções que resolvem um problema.

O início

Como dito anteriormente, Clojure possui uma sintaxe muito simples, porém que pode confundir muito (me confundiu muito) quem está começando no mundo de linguagens baseadas em Lisp. Abaixo como é escrito o código Clojure:

(operador operando1 operando2... operando)
Enter fullscreen mode Exit fullscreen mode

Não entendeu? Então vamos ao exemplo. Suponhamos que você deseja realizar uma soma entre 5 números.

O que em Javascript poderíamos fazer assim:

let resultado = 3 + 7 + 8;
Enter fullscreen mode Exit fullscreen mode

Em Clojure fazemos assim:

(+ 3 7 8)
=> 18
Enter fullscreen mode Exit fullscreen mode

No código acima o operador "+" soma os parâmetros 3, 7 e 8.

Um outro exemplo utilizando o famoso Hello World, onde a string "Hello World" é passada como parâmetro para a função println:

(println "Hello World")
=> "Hello World"
Enter fullscreen mode Exit fullscreen mode

Nomeando valores

Usa-se a instrução def para vincular o nome do símbolo a um valor. Exemplos:

(def texto "Iniciando com Clojure")
(def contas-pagas 100)
Imprimindo os valores definidos:

(println texto)
=> "Iniciando com Clojure"

(println "Quantidade de contas pagas:"  contas-pagas)
=> "Quantidade de contas pagas: 100"
Enter fullscreen mode Exit fullscreen mode

Estruturas de dados

Em Clojure todas as estruturas de dados são imutáveis, ou seja, seus valores não podem ser alterados.

Números básicos

Em Clojure podemos definir três tipos básicos de números, sendo eles Integer, Float ou fracionados. Exemplo:

(def numero-inteiro 10)
(def numero-ponto-flutuante 3.5)
(def numero-fracionado 10/3)
Enter fullscreen mode Exit fullscreen mode

Strings

Strings representam textos, assim como em outras linguagens de programação. Exemplo:

(def hobbit "Bilbo")
Enter fullscreen mode Exit fullscreen mode

Mapas

Mapas, assim como em outras linguagens de programação, são estruturas que armazenam chaves e valores. Abaixo algus exemplos de mapas em Clojure:

(def usuario {:nome "Guilherme" :idade 30})

(def funcao {"funcao-soma" +})
Enter fullscreen mode Exit fullscreen mode

Também é possível encadear mapas:

(def mapa {:nome "Guilherme" :endereco {:cidade "São Paulo" :rua "Rua Sete de Abril"}})
Enter fullscreen mode Exit fullscreen mode

Outra forma de criar mapas é através da função hash-map:

(def usuario (hash-map :nome "Guilherme" :cidade "São Paulo"))
Enter fullscreen mode Exit fullscreen mode

Para recuperar alguma informação do mapa, utilizamos a função get. Nela nós passamos o mapa e a keyword utilizada como chave para recuperar a informação desejada. Exemplo:

(get mapa :nome)
=> "Guilherme"
Enter fullscreen mode Exit fullscreen mode

Keywors são geralmente utilizadas como chaves em mapas no Clojure. No exemplo anterior, :nome é uma keyword.

Vetores

Um vetor é como um array em linguagens mais comuns, onde o index começa no 0. Definindo um símbolo como vetor:

(def numeros [3 2 1])
Enter fullscreen mode Exit fullscreen mode

Recuperando item do vetor de acordo com o índice:

(get numeros 2)
=> 1
Enter fullscreen mode Exit fullscreen mode

Também é possível criar vetores utilizando a função vector

(def empresas (vector "Apple" "Microsoft" "Samsung"))

(get empresas 1)
=> "Microsoft"
Enter fullscreen mode Exit fullscreen mode

Listas

Listas são parecidas com vetores em Clojure, porém com algumas diferenças. Por exemplo, para recuperar algum item de acordo com a posição da lista, usa-se a função nth e não a função get. Para declarar uma lista, basta definir os itens da lista entre parênteres e colocar um apóstrofo no início. Exemplo:

(def numeros '(1 2 3 4))
(def estados '("SP" "RJ" "RS" "PR"))

(nth estados 2)
=> "RS"
Enter fullscreen mode Exit fullscreen mode

Levando em consideração a performance, a função get é mais rápida que a nth, pois a nth passa por todos os elementos da lista para encontrar o item buscado.

Também é possível criar listas utilizando a função list:

(def numeros (list 1 2 3 4))
Enter fullscreen mode Exit fullscreen mode

Sets

Sets são coleções em que os itens são únicos, ou seja, não podem se repetir. Em Clojure temos duas formas de criar um Set:

Forma literal:

(def produtos #{"Refrigerante" "Carne" "Arroz"})
Enter fullscreen mode Exit fullscreen mode

Utilizando a função hash-set:

(def produtos (hash-set "Refrigerante" "Carne" "Arroz"))
Enter fullscreen mode Exit fullscreen mode

Podemos inclusive transformar um vetor em um set:

(set [2 2 5 6 5 1 1])
=> #{1 6 2 5}
Enter fullscreen mode Exit fullscreen mode

Por enquanto é isso. Quem sabe nos vemos em um próximo post. :)

Top comments (0)