SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
'GETTING' CLOJURE'GETTING' CLOJURE
'(PARENTHESES ARE JUST HUGS FOR YOUR CODE)'(PARENTHESES ARE JUST HUGS FOR YOUR CODE)
Created by /Jason Lewis Gary Trakhman
Javascript
            function(){
              return 5;
            }
          
FUNCTIONSFUNCTIONS
Put some parens around it, kill the braces
            (function()
              return 5;
              )
          
Change 'function' to 'fn', makes args into a vector
            (fn []
              return 5;
              )
          
Kill the 'return', last thing's always returned.
Welcome to Clojure.
            (fn [] 5)
          
Move the left parenthesis over a bit more...
Done.
            someFunction(arg1, arg2, arg3);
          
            (someFunction arg1 arg2 arg3)
          
CALLING STUFFCALLING STUFF
THIS ISN'T AN ACCIDENTTHIS ISN'T AN ACCIDENT
Javascript is 'Lisp in C's Clothing'
Says Crockford:
http://www.crockford.com/javascript/javascript.html
PUT ANOTHER WAY...PUT ANOTHER WAY...
Q: Why do you think we've gotten so much mileage out of
javascript?
A: Lisp is very powerful, and it will never die
Should look familiar
Don't freak out
DON'T FREAK OUT
{:key1 5,
 :key2 nil}
[1 2 3 4 "five"]
          
[1 [2] #{3} {4 4} (constantly 5)]
          
=> (range 10)
(0 1 2 3 4 5 6 7 8 9)
=> (take 11 (range))
(0 1 2 3 4 5 6 7 8 9 10)
=> (last (range)) ;;Hope you don't mind waiting a long time.
          
DATADATA
Evals to...
;; semicolons are comments, commas are ignored,
;; check out this weird hash­map
{:a­keyword 5,
 "a string key" "a string value",
 ["a" :vector "acting" :as [:a :compound] "key"]
 (fn [] "a no­arg function
that returns this multi­line string,
the function itself is the value"),
 + '(functions can be keys too, and when
you quote symbols, you just
have symbols, not what they represent)}
          
{:a­keyword 5, "a string key" "a string value",
["a" :vector "acting" :as [:a :compound] "key"]
#<user$eval331$fn__332 user$eval331$fn__332@a585ef>,
#<core$_PLUS_ clojure.core$_PLUS_@20a12d8f>
(functions can be keys too and when you quote symbols
 you just have symbols not what they represent)}
          
EVERYTHING IS DATAEVERYTHING IS DATA
ANYTHING CAN BE A KEY, BECAUSEANYTHING CAN BE A KEY, BECAUSE
1. Every object is also a 'value'
2. Values have true equality
3. Values Never Change (Immutability)
4. Without immutability, objects are just buckets in memory
...have you ever trusted a bucket with no values?
Q: Why is this big news?
A: I can write code and rest assured that other parts of my
program can't change the data that I'm working on.
Q: But I thought every program is simply a short-lived http
request handler that talks to a database? We just throw the
program state out after every request!
A: Well, that's one way to do it.
http://www.ibm.com/developerworks/library/wa-aj-
multitier2/
NODE.JS...NODE.JS...
http://www.andrerodrigues.me/isel-
workshop/intro.html#/24
NODE.JS... IS NOTHING NEWNODE.JS... IS NOTHING NEW
We can write our own loops
Node.js assumes threaded programming is hard, and
throws out the baby with the bath-water
Threaded programming is hard without real 'Data' or
'Values'
Composition of any sort is simpler with data
APPROXIMATING NODE.JSAPPROXIMATING NODE.JS
'Agents' are asynchronous queues, sharing threadpools to
do work, storing the last value returned.
(defn inc­last [val]
  (conj val (inc (last val))))
;; We make a sequence of 10 inc­last tasks,
;; then follow­up with a 'println' task
(def tasks
  (concat (repeat 10 inc­last)
          [(fn [val]
             (println val)
             val)]))
            
;; starts off with a value of [0]
(let [a (agent [0])]
  (doseq [t tasks]
    (send a t)))
;; prints: [0 1 2 3 4 5 6 7 8 9 10]
          
Agents are not values, they are mutable references with
asynchronous semantics
Clojure has other mutable references types, acting as
'containers' for values, for various use cases.
Nothing prevents you from making your own.
(let [f (future (do­a­bunch­of­stuff))] ;; in another thread
  (do­stuff­in­this­thread)
  ;; return the value in f, blocking if it's not finished
  (deref f))
        
MORE!MORE!
Basically,
Clojure promotes your ability to do whatever you want, by
simplifying things to their bare essence.
WHAT WE REALLY WANTWHAT WE REALLY WANT
Tools that let us
1. Compose Systems
2. Change our minds
3. Re-use components in different contexts, processes,
servers, etc..
Data/Values give us the ability to decouple things easily
'(code is data)
BRAINSPLODEBRAINSPLODE
Read-Eval-Print-Loop
(class (read­string "(+ 1 2)"))
;; clojure.lang.PersistentList
(map class (read­string "(+ 1 2)"))
;; (clojure.lang.Symbol java.lang.Long java.lang.Long)
          
R-E-P-LR-E-P-L
1. Read: (read-string "(+ 1 2)") => '(+ 1 2)
2. Eval: (eval '(+ 1 2)) => 3
3. What if there's something in the middle?
This is only the beginning
(defn only­even!
 [val]
 (if (and (integer? val) (odd? val))
   (inc val)
   val))
(map only­even! (read­string "(+ 1 2)"))
;; '(+ 2 2)
(eval (map only­even! (read­string "(+ 1 2)")))
;; 4
          
Everybody likes chaining, right?
How is this implemented? Is this reusable?
$("#p1").css("color","red").slideUp(2000).slideDown(2000);
          
What if, as a library author, you could just not write that fluent
interface code at all?
(use 'clojure.string)
;; These are equivalent
(map trim (split (upper­case "hola, world") #","))
;; ("HOLA" "WORLD")
(­> "hola, world"
    upper­case
    (split #",")
    (­>> (map trim)))
;; ("HOLA" "WORLD")
          
Really useful when you're doing a lot of collection operations,
filtering, etc.
(­>> (range)
     (filter even?)
     (map (partial * 2))
     (take 10)
     (into []))
;; [0 4 8 12 16 20 24 28 32 36]
;; versus
(into []
      (take 10 (map (partial * 2)
                    (filter even? (range)))))
          
1. I find the flat one easier to think about.
2. Semantically equivalent.
3. No burden on implementing code. Functions don't care
about how they're used.
Giving the user choices is more effective with more powerful
languages. Leads to simple, composable libraries.
Let's look at a real one.
(defmacro lazy­seq
  "Takes a body of expressions that returns an ISeq or nil, and yields
  a Seqable object that will invoke the body only the first time seq
  is called, and will cache the result and return it on all subsequent
  seq calls. See also ­ realized?"
  {:added "1.0"}
  [& body]
  (list 'new 'clojure.lang.LazySeq (list* '^{:once true} fn* [] body)))
;; simply returns a list, allocates a Java object (LazySeq) and wraps
;; your expressions in a function
(macroexpand­1 '(lazy­seq ANYTHING1 ANYTHING2))
;; '(new clojure.lang.LazySeq (fn* [] ANYTHING1 ANYTHING2))
          
MACROSMACROS
Let's create an infinite sequence representing a square-wave
--__--__--__--__
No mutable variables
(defn square­wave
  "t is the period for a half­cycle"
  [t]
  (letfn
    [(osc [cur­value so­far]
       (let [so­far (mod so­far t)
             next­val (if (zero? so­far)
                        (­ cur­value)
                        cur­value)]
         (cons next­val
               (lazy­seq (osc next­val
                              (inc so­far))))))]
    (osc 1 0)))
          
(take 10 (square­wave 3))
;; (­1 ­1 ­1 1 1 1 ­1 ­1 ­1 1)
          
CALL TO ACTIONCALL TO ACTION
1. Learn Clojure
2. Build cool things
3. Screencasts!
(You ruby guys really know how to make good screencasts)
DEMO TIMEDEMO TIME
CLOJURE ON THE WEBCLOJURE ON THE WEB
Now clone this:
https://github.com/canweriotnow/bohjure
RESOURCESRESOURCES
Clojure: http://clojure.org
Fun Exercises: http://www.4clojure.com
Cheatsheets: http://clojure.org/cheatsheet
Building: https://github.com/technomancy/leiningen
Insight: http://www.youtube.com/user/ClojureTV
Community docs: http://clojuredocs.org
Blogs: http://planet.clojure.in
Light Table: http://www.lighttable.com
this doc: http://gtrak.github.io/bohconf.clojure
MORE DEMO TIMEMORE DEMO TIME
THANKS FOR COMING!THANKS FOR COMING!
WE ARE:WE ARE:
Gary Trakhman
Software Engineer at
@gtrakGT
Revelytix, Inc.
Jason Lewis
CTO at
@canweriotnow
An Estuary, LLC

Mais conteúdo relacionado

Mais procurados

Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Nilesh Jayanandana
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Codemotion
 
ES6 PPT FOR 2016
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016Manoj Kumar
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6Solution4Future
 
How to Vim - for beginners
How to Vim - for beginnersHow to Vim - for beginners
How to Vim - for beginnersMarcin Rogacki
 
jRuby: The best of both worlds
jRuby: The best of both worldsjRuby: The best of both worlds
jRuby: The best of both worldsChristopher Spring
 
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Codemotion
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overviewhesher
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.boyney123
 
The Promised Land (in Angular)
The Promised Land (in Angular)The Promised Land (in Angular)
The Promised Land (in Angular)Domenic Denicola
 
EventMachine for RubyFuZa 2012
EventMachine for RubyFuZa   2012EventMachine for RubyFuZa   2012
EventMachine for RubyFuZa 2012Christopher Spring
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-CNissan Tsafrir
 
Let'swift "Concurrency in swift"
Let'swift "Concurrency in swift"Let'swift "Concurrency in swift"
Let'swift "Concurrency in swift"Hyuk Hur
 
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...Codemotion
 
The Ring programming language version 1.8 book - Part 82 of 202
The Ring programming language version 1.8 book - Part 82 of 202The Ring programming language version 1.8 book - Part 82 of 202
The Ring programming language version 1.8 book - Part 82 of 202Mahmoud Samir Fayed
 

Mais procurados (20)

Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6
 
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017 Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
Davide Cerbo - Kotlin: forse è la volta buona - Codemotion Milan 2017
 
ES6 PPT FOR 2016
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016
 
Modern JS with ES6
Modern JS with ES6Modern JS with ES6
Modern JS with ES6
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6
 
How to Vim - for beginners
How to Vim - for beginnersHow to Vim - for beginners
How to Vim - for beginners
 
Steady with ruby
Steady with rubySteady with ruby
Steady with ruby
 
jRuby: The best of both worlds
jRuby: The best of both worldsjRuby: The best of both worlds
jRuby: The best of both worlds
 
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
Joe Bew - Apprendi un nuovo linguaggio sfruttando il TDD e il Clean Code - Co...
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
 
The Promised Land (in Angular)
The Promised Land (in Angular)The Promised Land (in Angular)
The Promised Land (in Angular)
 
Akka tips
Akka tipsAkka tips
Akka tips
 
EventMachine for RubyFuZa 2012
EventMachine for RubyFuZa   2012EventMachine for RubyFuZa   2012
EventMachine for RubyFuZa 2012
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-C
 
Let'swift "Concurrency in swift"
Let'swift "Concurrency in swift"Let'swift "Concurrency in swift"
Let'swift "Concurrency in swift"
 
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
Lucio Floretta - TensorFlow and Deep Learning without a PhD - Codemotion Mila...
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
The Ring programming language version 1.8 book - Part 82 of 202
The Ring programming language version 1.8 book - Part 82 of 202The Ring programming language version 1.8 book - Part 82 of 202
The Ring programming language version 1.8 book - Part 82 of 202
 

Destaque

AI is the New UI - Tech Vision 2017 Trend 1
AI is the New UI - Tech Vision 2017 Trend 1AI is the New UI - Tech Vision 2017 Trend 1
AI is the New UI - Tech Vision 2017 Trend 1Accenture Technology
 
Measuring Success in the Lean IT World
Measuring Success in the Lean IT WorldMeasuring Success in the Lean IT World
Measuring Success in the Lean IT WorldLean IT Association
 
Putting the Puzzle Together: Integrating Emerging Best Pracitces
Putting the Puzzle Together: Integrating Emerging Best PracitcesPutting the Puzzle Together: Integrating Emerging Best Pracitces
Putting the Puzzle Together: Integrating Emerging Best PracitcesLean IT Association
 
The Enemy Within: Stopping Advanced Attacks Against Local Users
The Enemy Within: Stopping Advanced Attacks Against Local UsersThe Enemy Within: Stopping Advanced Attacks Against Local Users
The Enemy Within: Stopping Advanced Attacks Against Local UsersTal Be'ery
 
Improve your Retention with this One Change - David Cancel, CEO at Drift
Improve your Retention with this One Change - David Cancel, CEO at DriftImprove your Retention with this One Change - David Cancel, CEO at Drift
Improve your Retention with this One Change - David Cancel, CEO at DriftSaaStock
 
Zimbra propulsé par le n°1 de l'hébergement critique
Zimbra propulsé par le n°1 de l'hébergement critiqueZimbra propulsé par le n°1 de l'hébergement critique
Zimbra propulsé par le n°1 de l'hébergement critiqueCloud Temple
 
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...SaaStock
 
Aben Resources - Investor Presentation
Aben Resources - Investor PresentationAben Resources - Investor Presentation
Aben Resources - Investor PresentationCompany Spotlight
 
L'analytics pour les publishers conférence aadf
L'analytics pour les publishers   conférence aadfL'analytics pour les publishers   conférence aadf
L'analytics pour les publishers conférence aadfPrénom Nom de famille
 
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...DataStax
 
Everest Group FIT matrix for Robotic Process Automation (rpa) technology
Everest Group FIT matrix for Robotic Process Automation (rpa) technologyEverest Group FIT matrix for Robotic Process Automation (rpa) technology
Everest Group FIT matrix for Robotic Process Automation (rpa) technologyUiPath
 
Comparison of Open Source Frameworks for Integrating the Internet of Things
Comparison of Open Source Frameworks for Integrating the Internet of ThingsComparison of Open Source Frameworks for Integrating the Internet of Things
Comparison of Open Source Frameworks for Integrating the Internet of ThingsKai Wähner
 
Machine Shop 2020 - Digital Manufacturing Decoded
Machine Shop 2020 - Digital Manufacturing DecodedMachine Shop 2020 - Digital Manufacturing Decoded
Machine Shop 2020 - Digital Manufacturing DecodedSandvik Coromant
 
Levée du secret professionnel : oser faire marche arrière
Levée du secret professionnel : oser faire marche arrièreLevée du secret professionnel : oser faire marche arrière
Levée du secret professionnel : oser faire marche arrièreJLMB
 

Destaque (17)

AI is the New UI - Tech Vision 2017 Trend 1
AI is the New UI - Tech Vision 2017 Trend 1AI is the New UI - Tech Vision 2017 Trend 1
AI is the New UI - Tech Vision 2017 Trend 1
 
Measuring Success in the Lean IT World
Measuring Success in the Lean IT WorldMeasuring Success in the Lean IT World
Measuring Success in the Lean IT World
 
Putting the Puzzle Together: Integrating Emerging Best Pracitces
Putting the Puzzle Together: Integrating Emerging Best PracitcesPutting the Puzzle Together: Integrating Emerging Best Pracitces
Putting the Puzzle Together: Integrating Emerging Best Pracitces
 
The Enemy Within: Stopping Advanced Attacks Against Local Users
The Enemy Within: Stopping Advanced Attacks Against Local UsersThe Enemy Within: Stopping Advanced Attacks Against Local Users
The Enemy Within: Stopping Advanced Attacks Against Local Users
 
Improve your Retention with this One Change - David Cancel, CEO at Drift
Improve your Retention with this One Change - David Cancel, CEO at DriftImprove your Retention with this One Change - David Cancel, CEO at Drift
Improve your Retention with this One Change - David Cancel, CEO at Drift
 
Zimbra propulsé par le n°1 de l'hébergement critique
Zimbra propulsé par le n°1 de l'hébergement critiqueZimbra propulsé par le n°1 de l'hébergement critique
Zimbra propulsé par le n°1 de l'hébergement critique
 
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...
Achieving Meaningful Exits in SaaS - Mark MacLeod - Founder at SurePath Capit...
 
Aben Resources - Investor Presentation
Aben Resources - Investor PresentationAben Resources - Investor Presentation
Aben Resources - Investor Presentation
 
L'analytics pour les publishers conférence aadf
L'analytics pour les publishers   conférence aadfL'analytics pour les publishers   conférence aadf
L'analytics pour les publishers conférence aadf
 
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...
Building a Pluggable Analytics Stack with Cassandra (Jim Peregord, Element Co...
 
Everest Group FIT matrix for Robotic Process Automation (rpa) technology
Everest Group FIT matrix for Robotic Process Automation (rpa) technologyEverest Group FIT matrix for Robotic Process Automation (rpa) technology
Everest Group FIT matrix for Robotic Process Automation (rpa) technology
 
Le web design - fullCONTENT
Le web design - fullCONTENTLe web design - fullCONTENT
Le web design - fullCONTENT
 
Le Fonds de soutien à l'investissement local: un succès qui bénéficie à 80% a...
Le Fonds de soutien à l'investissement local: un succès qui bénéficie à 80% a...Le Fonds de soutien à l'investissement local: un succès qui bénéficie à 80% a...
Le Fonds de soutien à l'investissement local: un succès qui bénéficie à 80% a...
 
Comparison of Open Source Frameworks for Integrating the Internet of Things
Comparison of Open Source Frameworks for Integrating the Internet of ThingsComparison of Open Source Frameworks for Integrating the Internet of Things
Comparison of Open Source Frameworks for Integrating the Internet of Things
 
Five Rules of the Insurance Game
Five Rules of the Insurance GameFive Rules of the Insurance Game
Five Rules of the Insurance Game
 
Machine Shop 2020 - Digital Manufacturing Decoded
Machine Shop 2020 - Digital Manufacturing DecodedMachine Shop 2020 - Digital Manufacturing Decoded
Machine Shop 2020 - Digital Manufacturing Decoded
 
Levée du secret professionnel : oser faire marche arrière
Levée du secret professionnel : oser faire marche arrièreLevée du secret professionnel : oser faire marche arrière
Levée du secret professionnel : oser faire marche arrière
 

Semelhante a 'Getting' Clojure - '(parentheses are just hugs for your code)

What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)Pavlo Baron
 
Javascript: the important bits
Javascript: the important bitsJavascript: the important bits
Javascript: the important bitsChris Saylor
 
Designing with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaDesigning with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaNaresha K
 
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...Philip Schwarz
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014hwilming
 
Ceylon idioms by Gavin King
Ceylon idioms by Gavin KingCeylon idioms by Gavin King
Ceylon idioms by Gavin KingUnFroMage
 
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...Philip Schwarz
 
The Ring programming language version 1.3 book - Part 57 of 88
The Ring programming language version 1.3 book - Part 57 of 88The Ring programming language version 1.3 book - Part 57 of 88
The Ring programming language version 1.3 book - Part 57 of 88Mahmoud Samir Fayed
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John StevensonJAX London
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)Jacek Laskowski
 
[ “Love", :Ruby ].each { |i| p i }
[ “Love", :Ruby ].each { |i| p i }[ “Love", :Ruby ].each { |i| p i }
[ “Love", :Ruby ].each { |i| p i }Herval Freire
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...julien.ponge
 
Kotlin: maybe it's the right time
Kotlin: maybe it's the right timeKotlin: maybe it's the right time
Kotlin: maybe it's the right timeDavide Cerbo
 
JavaScript Execution Context
JavaScript Execution ContextJavaScript Execution Context
JavaScript Execution ContextJuan Medina
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 

Semelhante a 'Getting' Clojure - '(parentheses are just hugs for your code) (20)

What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Javascript: the important bits
Javascript: the important bitsJavascript: the important bits
Javascript: the important bits
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Designing with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaDesigning with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf India
 
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
 
Ceylon idioms by Gavin King
Ceylon idioms by Gavin KingCeylon idioms by Gavin King
Ceylon idioms by Gavin King
 
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...The Functional Programming Triad of Folding, Scanning and Iteration - a first...
The Functional Programming Triad of Folding, Scanning and Iteration - a first...
 
The Ring programming language version 1.3 book - Part 57 of 88
The Ring programming language version 1.3 book - Part 57 of 88The Ring programming language version 1.3 book - Part 57 of 88
The Ring programming language version 1.3 book - Part 57 of 88
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 
Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)
 
[ “Love", :Ruby ].each { |i| p i }
[ “Love", :Ruby ].each { |i| p i }[ “Love", :Ruby ].each { |i| p i }
[ “Love", :Ruby ].each { |i| p i }
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
 
Kotlin: maybe it's the right time
Kotlin: maybe it's the right timeKotlin: maybe it's the right time
Kotlin: maybe it's the right time
 
JavaScript Execution Context
JavaScript Execution ContextJavaScript Execution Context
JavaScript Execution Context
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 

Último

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 

Último (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 

'Getting' Clojure - '(parentheses are just hugs for your code)