Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
presentation.pdf
Search
Eduardo Borges
June 20, 2015
Programming
5
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
presentation.pdf
Slides for an introductory talk on Clojure for the devmt community
Eduardo Borges
June 20, 2015
Other Decks in Programming
See All in Programming
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
270
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
880
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Marketing to machines
jonoalderson
1
5.9k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Become a Pro
speakerdeck
PRO
31
6.3k
Leo the Paperboy
mayatellez
10
2.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Cult of Friendly URLs
andyhume
79
7k
Design in an AI World
tapps
1
350
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
360
Designing for Timeless Needs
cassininazir
1
530
Transcript
Clojure
O que é clojure? Clojure é uma linguagem de programação
dinâmica que roda da JVM, CLR e JavaScript. Ela foi projetada para ser simples, interativa, flexível e ter facilidades para concorrência.
Sintaxe (+ 1 2) ;; 3
Homoiconicity Código em Clojure é escrito com suas próprias estruturas
de dados.
Formas especiais em Clojure def if do let quote var
fn throw try monitor-enter monitor-exit loop recur
Formas especiais em Ruby BEGIN END alias and begin break
\case class def defined? do else elsif end ensure false for if next nil not or redo rescue retry return self super then true undef unless until when while yield ...
Formas especiais em Clojure def if do let quote var
fn throw try monitor-enter monitor-exit loop recur
Sintaxe DEMO
Tipos de dados Literais Numbers - 123 Doubles - 98.9
BigInt - 822322N BigDecimal - 87549.23M Ratios - 22/7 String - “Uma string” Character - \c, \a Symbol - double, even? Keyword - :azul?, :callback-fn Booleans - true, false Null - nil Regex - #”[a-z]+”
Tipos de dados Listas Vetores Maps Sets (1 2 3)
(clojure symbols) (list 1 2 5) [1 2 3 4 5] [:keyword symbol 1 2/3] {:chave "valor" :chave2 "valor2"} {1 :val} #{1 2 3 4} (set [1 1 3 4 5])
Imutabilidade As estruturas de dados são imutáveis e persistentes. (def
my-map {:name "Heisenberg"}) ;;=> my-map (assoc my-map :job "Drug dealer") ;;=> {:name "Heisenberg", :job "Drug dealer"} my-map ;;=> {:name "Heisenberg"}
Persistent Data Structures
Tipos de dados DEMO
Functions Meios de criação de funções • fn • defn
• #() (fn [x] (* x x)) (defn square [x] (* x x)) #(* % %) Funções de alta ordem (map square [1 2 3 4]) ;;=> (1 4 9 16) (reduce + [1 2 3 4]) ;;=> 10 (filter #(zero? (rem % 2)) [1 2 3 4]) ;;=> (2 4)
Partial application e Function Composition (def double (partial * 2))
(double 2) ;;=> 4 (def upper-cased-chars (comp seq upper-case)) (upper-cased-chars "abc") ;;=> (\A \B \C)
Functions DEMO
Sequences Clojure implementa abstrações de sequencia para • Listas •
Vetores • Maps • Sets • Strings • Diretórios • Arquivos • Flexível para implementar em outras estruturas de dados ou até mesmo plataformas
Sequences (ns sequence-demo (:require [clojure.java.io :as io] [clojure.string :as s]))
;; Sequencia de arquivos e diretorios (def arvore-de-diretorio (file-seq (io/file "some/path"))) ;;=> (<#clojure.java.io.File#347fd723 /some/path/folder> ;; <#clojure.java.io.File#584ffd22 /some/path/folder/file.txt>) ;; Filtrar somente arquivos (filter (fn [file-object] (.isFile file-object)) arvore-de-diretorio) ;;=> (<#clojure.java.io.File#584ffd22 /some/path/folder/file.txt> ;; Sequencia de linhas em um arquivo (def lines (line-seq (io/reader (io/file "some/file.txt")))) ;;=> ("first line" ;; "second line") ;; Deixa todas as linhas em caixa alta (map s/upper-case lines) ;; => ("FIRST LINE" ;; "SECOND LINE") ;; Filtra todos os numeros pares num Vetor (filter even? [1 2 3 4 5]) ;;=> (2 4)
Laziness Resultados computados em demanda ;; Sequencia infinita (def infinite-range
(range)) ;; Sequencia infinita de numeros impares (def infinite-odd (filter odd? (range))) ;; Computando somente 3 numeros impares (take 3 infinite-odd) ;;=> (1 3 5) ;; Sequencia de Fibonacci (defn fib ([] (fib 0 1)) ([a b] (lazy-seq (cons a (fib b (+ a b)))))) (take 5 (fib)) ;;=> (0 1 1 2 3)
Java Interop (ns java-interop-demo (:import java.util.Date java.util.ArrayList)) (def now (Date.))
;; Acessando metodos do objeto (. now getSeconds) ;; 26 (.getSeconds now) ;; 26 ;; Metodos estaticos (Math/pow 2 2) ;; 4.0 ;; Acessando propriedades e metodos em corrente (.. System getProperties (get "java.version")) ;; "1.8.0_45" ;; Com macros (def arr-list (ArrayList.)) (doto arr-list (.add 0 1) (.add 1 2)) (str arr-list) ;;=> [1, 2]
Macros Código gerado por código • Em tempo de compilação
• Funcionalidades de linguagem podem ser macros (defmacro infix-notation [form] `(~(second form) ~(first form) ~(last form))) (infix-notation (1 + 2)) ;;=> 3
Macros DEMO
Concorrência Atom (def medias (atom [])) (swap! medias conj 1)
;;=> #<Atom@asd3j2 [1] @medias ;;=> [1] (reset! medias []) (deref medias) ;;=> []
Concorrência Agent (ns logger (:import java.io BufferedWriter FileWriter)) (def wtr
(agent (BufferedWriter. (FileWriter. "log.txt")))) (defn log [message] (send wtr (fn [out message] (.write out message)) message)) (log "logging") (log "warning")
Concorrência Ref (def conta-do-paulo (ref 10)) (def conta-do-wilson (ref 100))
(defn transferir [acc-from acc-to amount] (dosync (alter acc-from - amount) (alter acc-to + amount))) (transferir conta-do-wilson conta-do-paulo 10) @conta-do-paulo ;; => 20 @conta-do-wilson ;; => 90
Concorrência Future (def f (future (expensive-computation))) ;; Retorna o resultado
da computacao, ;; vai bloquear a thread ate que a funcao seja executada @f
Concorrência Promise (def p (promise)) (realized? p) ;; => false
(deliver p 50) (realized? p) ;; => true @p ;; => 50
Concorrência core.async (ns sandbox.core-async-events (:require-macros [cljs.core.async.macros :refer [go]]) (:require [cljs.core.async
:as async :refer [put! >! <! chan]] [domina.css :as css] [domina.event :as event])) (defn events [element event-type] (let [c (chan)] (event/listen! element event-type (fn [e] (put! c e))) c)) (let [click-events (events (css/sel "#some-button") :click)] (go (while true (do-something-with (<! click-events)))) click-events)
Polimorfismo Protocols (defprotocol IArea (area [this])) (defrecord Square [x] IArea
(area [this] (let [x (:x this)] (* x x)))) (defrecord Circle [r] IArea (area [this] (let [radius (:r this)] (* Math/PI (Math/pow radius 2))))) (def circle (->Circle 3)) (def sq (->Square 4)) (area circle) ;;=> 28.27433... (area sq) ;;=> 16
Polimorfismo Multimethods (defmulti area (fn [[type]] type)) (defmethod area :square
[[_ x]] (* x x)) (defmethod area :circle [[_ radius]] (* Math/PI (Math/pow radius 2))) (defmethod area :default [_] "Argument not supported") (def circle [:circle 3]) (def sq [:square 4]) (area circle) ;; => 28.27433... (area sq) ;; => 16
Fim (def you! (all-of devmt-community)) (thank you!) Como me achar:
[email protected]
eduardomrb (GitHub, devmt.slack.com)