DEV Community

Cover image for Clojure na visão de um dev JS
Gabriel Grubba
Gabriel Grubba

Posted on • Originally published at blog-grubba.vercel.app

Clojure na visão de um dev JS

XKCD HQ

Por qual razão LISP (Clojure) ?

Tenho visto possivelmente depois de algum tempo aprendendo Orientação a Objetos, alguns limites desse paradigma e para ter uma mudança de ares busquei algo que resolvia alguns problemas de uma maneira diferente

Essa tirinha do xkcd é sempre atemporal, mesmo depois de muitos anos da existência do lisp, ainda acabamos por usar ele novamente, nesse caso com uma roupagem mais atual e um carro poderoso que quase todo o mundo usa. A JVM, todos sabemos o poder da JVM com paralelismo e concorrência, sendo o padrão de mercado faz um tempo. O Clojure junto da maquina virtual do java traz esse poder com a simplicidade de código como dado.

Código é dado

Em lisp tudo é uma lista e entenda lista como Array. Outro ponto essencial é que por ser uma linguagem funcional, um dialeto de lisp, ele usa funções como seu core. Claro que você como dev JS já sabe o que isso implica, usar funções e callbacks, ter funções como retorno e usar funções como argumento.

Como é isso dai de fazer função?

Em JS declaramos funções de varias formas, de maneira mais clara podemos fazer desse jeito:
o exemplo que farei é uma função que soma dois argumentos e retorna o resultado

  function somar( a, b){
    return a + b
  }
Enter fullscreen mode Exit fullscreen mode

agora em clojure:

(defn somar
  "Recebe dois valores como parametro e retorna o resultado da soma"
  [a b]
  (+ a b))
Enter fullscreen mode Exit fullscreen mode

Pontos super legais que eu amei no clojure, essa string que eu coloquei como segundo parametro é a documentação da função. Código auto documentable .
Somar e todas as funções matematicas seguem a notação polonesa

E as variaveis ?

Na nossa tentativa de diminuir side effects criamos variaveis dentro de funções para mostrar o que significa cada simbolo.
Nesse exemplo a seguir eu criei algumas variaveis.

(defn delivery-tax
  "Calculate the price of the delivery tax based on input based on this table:
   80 => $ -> 15
   80  < $ > 250 -> 5
   $ >=  250  -> 0"
  [final-items-value]
  (let [free-tax 0   ;;Variaveis
        mid-tax 5
        max-tax 15
        min-price-limit 80
        max-price-limit 250
        ]
    (cond
      (<= final-items-value 0) "err"
      (<= final-items-value min-price-limit) max-tax
      (and (> final-items-value min-price-limit) (< final-items-value max-price-limit)) mid-tax
      (>= final-items-value max-price-limit) free-tax)))
Enter fullscreen mode Exit fullscreen mode

Tem tudo isso de parenteses mesmo ?

Você coda JS, o que você vê em um dia de parenteses e colchetes é pouco comparado ao código em clojure.
mas por ser apenas parenteses, ganhamos alguns super poderes, como os de macro e gostaria de finalizar o blog-post com dois macro engraçados que mostram o poder da linguagem.
A função some em clojure e outras muitas langs, pegam um array e verificam se algum valor está presente no array como nesse caso aqui

(some #(= 5 %) [1 2 3 4 5])
=> true
Enter fullscreen mode Exit fullscreen mode

podemos alterar via macro para que essa mesma função some (rs) todos os resultado do array

(some [1 2 3 4 5])
=> 15
Enter fullscreen mode Exit fullscreen mode

Por fim posso fazer o some literalmente sumir com meu array se eu quiser mudar a macro

(some [1 2 3 4 5])
=> []
Enter fullscreen mode Exit fullscreen mode

essa simples introdução ao Clojure era algo que eu queria ter visto antes e teria me deixado mais animado ainda para codar nisso que é tão simples e tão divertido ao mesmo tempo.

recomendo a todos que tal como eu estavam meio cansado do mesmo de sempre.

Top comments (0)