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
Inteligência artificial
Matemática
Preciso de um mestrado?
Teorias, termos
Teoria das categorias
- Functors
- Applicative Functors
- Monoids
- Monads
- Arrows
- Semigrupos
- Comonads
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
E o código...
... cada vez mais complexo
E agora?
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
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
(obrigado)
@p_balduino
@clj_sp
http://pbalduino.github.io/qcon2013