Entenda Clojure em 15 minutos – (sp (first meetup)) – Sintaxe



Entenda Clojure em 15 minutos – (sp (first meetup)) – Sintaxe

0 0


cljsp01

Apresentação feita para o primeiro encontro de Clojure em São Paulo

On Github pbalduino / cljsp01

Entenda Clojure em 15 minutos

(sp (first meetup))

São Paulo - 23/Ago/2013

Plínio Balduino / @p_balduino

Plínio Balduino

A past century software developer

Clojure

É um LISP

Compila seu código para JVM ou CLR (.NET)

Sintaxe

(defn fatorial [x]
  (if (= x 1)
      1
      (* (x (dec x)))))

(fatorial 6)

Sintaxe

(operador valor valor ... valor)

Sintaxe

(operador 
  (operador valor 
            valor 
            ... 
            valor)
  valor)

Precedência de operadores

1 + 2 * 3

Precedência de operadores

1 + 2 * 3

1 + (2 * 3)

Precedência de operadores

(+ 1 (* 2 3))

Macros

Permite que você interfira no compilador em tempo de execução.

Macros

(defn if-not [condition falsy truey]
  (if condition
    falsy
    truey))

(if-not authorized
  (show-alert "Acesso negado")
  (drop-database))

Macros

(defmacro if-not [condition truey falsy] 
  `(if ~condition 
      ~falsy 
      ~truey))

(if-not authorized
  (show-alert "Acesso negado")
  (drop-database))

Funcional

(apply + (range 1 7))
; => 21

(apply * (range 1 7))
; => 720

(apply average (range 1 7))
; => 720

Simplicidade

Java

public static long anFibN(final long n) {
  double p = (1 + Math.sqrt(5)) / 2;
  double q = 1 / p;
  return (long) ((Math.pow(p, n) + 
                  Math.pow(q, n)) / 
                  Math.sqrt(5));
}

Simplicidade

Clojure

(defn fibs []
  (map first 
       (iterate (fn [[a b]] 
                    [b (+ a b)])
                [0 1])))

(def fib (lazy-cat [0 1] 
                   (map + fib (rest fib))))

Imutabilidade

Uma função retorna um novo valor

Thread safe

Você não erra o que não se move

Concorrência/Paralelismo

(defn sleep []
  (Thread/sleep 1000))

(defn fast-computation [x] (* x 2))

(defn heavy-computation [x]
  (sleep)
  (* x 2))

(time (doall (map heavy-computation 
                  [1 2 3 4 5])))
; "Elapsed time: 5002.32348 msecs"

(time (doall (pmap heavy-computation [1 2 3 4 5])))
; "Elapsed time: 1003.531455 msecs"

Dúvidas

Obrigado