Programação funcional no mundo real com

Clojure


QCon 2013

São Paulo - 31/Ago/2013

Plínio Balduino / @p_balduino

Plínio Balduino


A past century software developer

Plínio Balduino


www.casadocodigo.com.br

Programação funcional


Alan Turing / Alonzo Church

década de 1930

Programação funcional


Paradigma

 

Programação funcional


Paradigma

Forma diferente de pensar

Programação funcional


Função é a unidade básica

Linguagens funcionais


    Haskell

    LISP

    Scala

    JavaScript

Linguagens funcionais


    Haskell

    LISP

    Scala

    JavaScript

LISP


Academia

LISP


Parênteses

LISP


Inteligência artificial

Matemática


Preciso de um mestrado?

Teorias, termos


Teoria das categorias

  • Functors
  • Applicative Functors
  • Monoids
  • Monads
  • Arrows
  • Semigrupos
  • Comonads

Hoje não, obrigado.


Sejamos pragmáticos


Problemas do mundo real

Lei de Moore


Velocidade do processador estagnou

Lei de Moore


A solução?

Mais núcleos

Mais máquinas


Servidores

Cloud

Computação distribuída

Programação paralela e concorrente


Estados compartilhados


Race Condition

Locks


Deadlock

Locks


Livelock

E o código...


... cada vez mais complexo

E agora?

Clojure


Clojure


Integrado à JVM ou CLR

Clojure


Sintaxe simples

(operador parametro parametro)

(operador parametro
         (operador parametro 
                   parametro))

Imutabilidade


Thread safe por definição

E se eu precisar mudar?


Transients

Recursão

VARs são per thread

Feito para concorrência


Toda função implementa Runnable

Tipos para (quase) todos os gostos

Processamento concorrente


Não coordenado e síncrono

Atoms

Pense num contador compartilhado

Processamento concorrente


Não coordenado e assíncrono

Agents

Pense num processo de fork/join

Processamento concorrente


Coordenado e síncrono

Refs

Pense numa transferência bancária

STM


Software Transactional Memory

STM


É como um banco de dados

... mas na memória

STM


Performance?

Funções puras


Sem efeito colateral

Deterministas

Permitem memoization

Memoization?


Troca processamento por memória

Memoization


(defn fib [n]
  (if  (or (zero? n) (= n 1)) 
    1 
    (+  (fib (dec n)) 
        (fib (- n 2)))))
 
(time (fib 90))
; spent more than 30 minutes and I quit

Memoization


(def fib-memo)
 
(defn fib [n]
  (if  (or (zero? n) (= n 1)) 
    1 
    (+  (fib-memo (dec n))
        (fib-memo (- n 2))))) 
 
(def fib-memo (memoize fib))
 
(time (fib 90))
; "Elapsed time: 0.058 msecs"

Mas e se...?


Precisa de efeito colateral?

Use agent

core.async


A simplicidade das goroutines

Com o poder do Clojure

As ideias do Erlang e Go

core.logic


Programação lógica

Sudoku em 33 linhas

O poder do Prolog

Macros


Modifique a linguagem

em tempo de execução

DSLs made easy

Lazy


O processamento só acontece

quando for realmente necessário

Grandes quantidade de dados

Java interop


Você pode reutilizar todas

as suas bibliotecas do Java

(defn delayed-print []
  (println "Dormiu")
  (Thread/sleep 5000)
  (println "Acordou"))

(-> delayed-print 
    Thread. 
    .start)

Quem usa?


Puppet DB - Overtone - Prismatic - Order Harmony - Rocket List - Leeds College of Music - Rewryte - BeanStalk - ReadyForZero - Akamai - Appvise - backtype - Brand Karma - Berico - Citibank - Compass Labs - Factual - FlightCaster - Geni - Higiebus - Infinitely Beta - KamaGames - LeadTune - Max Planck Institute - Pico Quantitative Trading - Platogo - Relevance - Revelytix - Setere - Sonian - TheDeadline - Tianya (China) - Typewire - YouCanEat.at - WeatherBill - WorldSingles - WuSoup - AltLaw.org - Tech city map - Trampoline Systems - 2minutecv - Nanonation - Cognician - Mastodon C - BTS Group - Planspot.com - Nuroko - Damballa - BigML - Roomkey - boxuk.com - GateProtect - Kontera - DRW - Two Sigma - Climate - Puppet Labs - Copious - Trend Micro - IOOF - Heroku - SmartBIM - Intelie - EO2 - Chaordic - Reglare - Guiato

Resumindo


JVM (ou CLR)

Simplicidade

Concorrência

Use Clojure


(obrigado)


@p_balduino

@clj_sp

http://pbalduino.github.io/qcon2013