Clojure na visão de um dev JS

Primeiro contato de um dev JS com a beleza do lisp

tirinha do xkcd

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
  }

agora em clojure:

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

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)))

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

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

(some [1 2 3 4 5])
=> 15

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

(some [1 2 3 4 5])
=> []

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.

Contato

Se quiser discutir sobre qualquer assunto ou viu algum erro, não hesite em me marcar ou chamar no Twitter: @que_cara_legal
Estou sempre tentando trazer o que tenho estudado, as vezes traduzindo algums tópicos divertidos que me chamam atenção.