Clojure na visão de um dev JS

grubba

Gabriel Grubba

Posted on July 21, 2022

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.

💖 💪 🙅 🚩
grubba
Gabriel Grubba

Posted on July 21, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Clojure na visão de um dev JS
javascript Clojure na visão de um dev JS

July 21, 2022