SlideShare una empresa de Scribd logo
1 de 145
Descargar para leer sin conexión
Thinking the
Clojure Way
   Christophe Grand

GOTO Cph, May 13th 2011
Rejoice, Clojure is simple
                  Coding along/against
                  Singing with

                  à la carte
Rejoice, Clojure is simple
                        Coding along/against
                        Singing with
 Small regular syntax   à la carte
Rejoice, Clojure is simple
                                 Coding along/against
                                 Singing with
 Small regular syntax            à la carte



 Simple does not mean familiar
Rejoice, Clojure is simple
                                 Coding along/against
                                 Singing with
 Small regular syntax            à la carte



 Simple does not mean familiar
 Simple means not compound
Rejoice, Clojure is simple
                                    Coding along/against
                                    Singing with
 Small regular syntax               à la carte



 Simple does not mean familiar
 Simple means not compound
 Clojure is made of simple things
Rejoice, Clojure is simple
                                    Coding along/against
                                    Singing with
 Small regular syntax               à la carte



 Simple does not mean familiar
 Simple means not compound
 Clojure is made of simple things
 Small set of independent concepts
Rejoice, Clojure is simple
                                    Coding along/against
                                    Singing with
 Small regular syntax               à la carte



 Simple does not mean familiar
 Simple means not compound
 Clojure is made of simple things
 Small set of independent concepts
 One concept at a time
Rejoice, Clojure is simple
                                    Coding along/against
                                    Singing with
 Small regular syntax               à la carte



 Simple does not mean familiar
 Simple means not compound
 Clojure is made of simple things
 Small set of independent concepts
 One concept at a time
One bite at a time            faire 4 groupes :
                                 Syntax+FP
                                 Rec+lazy seqs
                                 polymorphism+types

Syntax
                                 interop+mutation

                                 les deux derniers blocs devraient être
                                 animés pour être mis au même niveau
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
State management
Syntax
Literals
Numbers              42 3.14 3/4 5.01M 43N
  Strings                 "Hello GOTO Cph"
Characters                    c newline
Keywords                           :a-key
 Symbols              foo clojure.core/map
 Vectors                  [1 "two" :three]
   Maps             {:key "val", :key2 42}
   Sets                  #{1 "two" :three}
  Regex                           #"a.*b"
    null                              nil
booleans*                      true false
         *anything but false and nil is true
What about lists?
What about lists?
Quoted lists are too literal: '(1   (+ 1 1))
What about lists?
Quoted lists are too literal: '(1   (+ 1 1))

Displaced as literals by vectors
What about lists?
Quoted lists are too literal: '(1   (+ 1 1))

Displaced as literals by vectors
Abstracted away by sequences
What about lists?
Quoted lists are too literal: '(1   (+ 1 1))

Displaced as literals by vectors
Abstracted away by sequences
Survive mostly for code representation
Lists are for code
    (defn abs [n]
      (if (neg? n)
        (- n)
        n))
Lists are for code
        (defn abs [n]
          (if (neg? n)
            (- n)
            n))


Pro tip: Lisp code is a stereogram
Lists are for code
               (defn abs [n]
                 (if (neg? n)
                   (- n)
                   n))


       Pro tip: Lisp code is a stereogram
Cross your eyes to see parens in the right place
Lists are for code
                defn abs [n](
                  if neg?( n)(
                    -( n)
                   n))


       Pro tip: Lisp code is a stereogram
Cross your eyes to see parens in the right place
Lists are for code
    (defn abs [n]
      (if (neg? n)
        (- n)
        n))
Lists are for code
    (defn abs [n]
      (if (neg? n)
        (- n)
        n))
                 function
Lists are for code
        (defn abs [n]
macro     (if (neg? n)
            (- n)
            n))
                     function
Lists are for code
          (defn abs [n]
macro       (if (neg? n)
              (- n)
              n))
                       function
special form
That’s all about syntax!
Functional
Programming
Clojure’s FP
Clojure’s FP
Impure
Clojure’s FP
Impure
Persistent collections
Clojure’s FP
Impure
Persistent collections
Strictly evaluated
Clojure’s FP
Impure
Persistent collections
Strictly evaluated
But lazy sequences
Clojure’s FP
Impure
Persistent collections
Strictly evaluated
But lazy sequences
 Not strictly lazy though!
Clojure’s FP
Impure
Persistent collections
Strictly evaluated
But lazy sequences
 Not strictly lazy though!
Persistent collections
Persistent collections
Vectors, maps and sets
Persistent collections
Vectors, maps and sets
Common usecases:
Persistent collections
Vectors, maps and sets
Common usecases:
 Vectors as tuples
Persistent collections
Vectors, maps and sets
Common usecases:
 Vectors as tuples
 Vectors as stacks
Persistent collections
Vectors, maps and sets
Common usecases:
 Vectors as tuples
 Vectors as stacks
 Maps as data
Persistent collections
Vectors, maps and sets
Common usecases:
 Vectors as tuples
 Vectors as stacks
 Maps as data
 Map as index, summary
Persistent collections
Vectors, maps and sets
Common usecases:
 Vectors as tuples
 Vectors as stacks
 Maps as data
 Map as index, summary
 Sets as containers, relations
Sequences
Sequences
First, what are sequences?
Sequences
First, what are sequences?
Abstraction over linked lists
Sequences
First, what are sequences?
Abstraction over linked lists
List-like views over data
Sequences
First, what are sequences?
Abstraction over linked lists
List-like views over data
 Support first and rest
Sequences
First, what are sequences?
Abstraction over linked lists
List-like views over data
 Support first and rest
 Replace iterators
Sequences
First, what are sequences?
Abstraction over linked lists
List-like views over data
 Support first and rest
 Replace iterators
 Replace indices
Lazy sequences
Lazy sequences
Sequences evaluated (realized) on demand
Lazy sequences
Sequences evaluated (realized) on demand
Allow to process big data
Lazy sequences
Sequences evaluated (realized) on demand
Allow to process big data
 or big intermediate values
Lazy sequences
   Sequences evaluated (realized) on demand
   Allow to process big data
     or big intermediate values

(->> (slurp "access.log") split-lines (map count)
  (filter odd?))
Lazy sequences

            Doesn’t matter w/ strict
            evaluation
Lazy sequences
Realization can go ahead of consumption
                                Doesn’t matter w/ strict
                                evaluation
Lazy sequences
Realization can go ahead of consumption
 Not suitable for control flow   Doesn’t matter w/ strict
                                evaluation
Lazy sequences
Realization can go ahead of consumption
 Not suitable for control flow   Doesn’t matter w/ strict
                                evaluation



 Better locality, less churn
That’s all about FP!
Clojure spirit
Clojure spirit
Clojure spirit
Pragmatism
Clojure spirit
Pragmatism
Correctness
Clojure spirit
Pragmatism
Correctness
Uniform interfaces
Clojure spirit
Pragmatism
Correctness
Uniform interfaces
Data over functions
Clojure spirit
Pragmatism
Correctness
Uniform interfaces
Data over functions
Sequences as computation media
Clojure spirit
Pragmatism
Correctness
Uniform interfaces
Data over functions
Sequences as computation media
Reftypes as mutation patterns
Pragmatism
Hosted on the JVM
Embrace the host limitations
 to be a better guest
Excellent Java interop
Performance over purity
LISP
Correctness
No silent error
Correct result or failure
Non-negotiable
 See 1.2 -> 1.3 numerics changes
 Unless the user opts in
Uniform interfaces
Uniform interfaces
Widespread small interfaces
Uniform interfaces
Widespread small interfaces
Tons of helpers fns built upon
Uniform interfaces
Widespread small interfaces
Tons of helpers fns built upon
It is better to have 100 functions operate on
one data structure than 10 functions on 10
data structures.
                                     – Alan Perlis
Uniform interfaces
Widespread small interfaces
Tons of helpers fns built upon
It is better to have 100 functions operate on
one data structure than 10 functions on 10
data structures.
                                     – Alan Perlis
It is better to have 100 functions operate on
one abstraction than 10 functions on 10
data structures.
                                   – Rich Hickey
Uniform interfaces

=> (-> {:product-id "ACME123", :description "Powder
water"} keys sort)
(:description :product-id)




=> (-> (javax.swing.JFrame.) bean keys sort)
(:JMenuBar :accessibleContext :active :alignmentX
:alignmentY :alwaysOnTop :alwaysOnTopSupported
:background :bufferStrategy :componentCount :components
:containerListeners :contentPane :cursorType
:defaultCloseOperation ...)
Data over functions
Large reuse of core collection fns
 Less specific code
Data go out of the process
 Don’t be too clever
A schema is a good API
Data over functions
Data over functions
How to enforce invariants
Data over functions
How to enforce invariants
 Write a validator function
Data over functions
How to enforce invariants
 Write a validator function
 Use it in fns pre- and post-conditions
Data over functions
How to enforce invariants
 Write a validator function
 Use it in fns pre- and post-conditions
 Use it in reftypes validators
Sequences as pipes
Sequences as pipes
Sequences as ephemeral media of
computation
Sequences as pipes
Sequences as ephemeral media of
computation

Each stage of a pipeline yields its own seq
Sequences as pipes
Sequences as ephemeral media of
computation

Each stage of a pipeline yields its own seq
The ends of the pipeline are not seqs:
Sequences as pipes
Sequences as ephemeral media of
computation

Each stage of a pipeline yields its own seq
The ends of the pipeline are not seqs:
 db, network, persistent collection etc.
Sequences as pipes
Sequences as ephemeral media of
computation

Each stage of a pipeline yields its own seq
The ends of the pipeline are not seqs:
 db, network, persistent collection etc.
Mutation patterns
Mutation patterns
Reftypes embody mutation patterns
Mutation patterns
Reftypes embody mutation patterns
Application state management:
Mutation patterns
Reftypes embody mutation patterns
Application state management:
 Refs, atoms and agents
Mutation patterns
Reftypes embody mutation patterns
Application state management:
 Refs, atoms and agents
Program state management:
Mutation patterns
Reftypes embody mutation patterns
Application state management:
 Refs, atoms and agents
Program state management:
 Vars
Mutation patterns
Reftypes embody mutation patterns
Application state management:
 Refs, atoms and agents
Program state management:
 Vars
Execution or dataflow management:
Mutation patterns
Reftypes embody mutation patterns
Application state management:
 Refs, atoms and agents
Program state management:
 Vars
Execution or dataflow management:
 Promises, delays and futures
How to think
functionally?
Break your habits
Tie your imperative hand
    behind your back!
Tie your OO hand too!
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Features
Syntax
Core Functional Programming
Recursion and loops
Lazy seqs (creating your owns)
Polymorphism
Types
Macros
Interop
Mutation
Allowed subset
Pure Functional Programming
 without recursion nor loops
 without lazy-seq
 without indices
Do it until it hurts!
  (and works)
Do it especially for
ill-suited problems!
Example:
Conway’s game of life
Rules
At each step in time, the following transitions occur:
•   Any live cell with fewer than two live neighbours
    dies, as if caused by under-population.
•   Any live cell with two or three live neighbours
    lives on to the next generation.
•   Any live cell with more than three live neighbours
    dies, as if by overcrowding.
•   Any dead cell with exactly three live neighbours
    becomes a live cell, as if by reproduction.
                                            (wikipedia)
Conway’s game of life
 Typical implementation is full of indices and loops
(defn step
 "Takes a vector of vectors of 0 and 1, and
  returns the next iteration of the automaton."
 [board]
  (let [w (count board)
         h (count (first board))]
    (loop [i 0 j 0 new-board board]
      (cond
        (>= i w) new-board
        (>= j h) (recur (inc i) 0 new-board)
        :else
           (let [n (neighbours-count board i j)
                 nb (cond
                      (= 3 n) (assoc-in new-board [i j] 1)
                      (not= 2 n) (assoc-in new-board [i j] 0)
                      :else new-board)]
             (recur i (inc j) new-board))))))
Conway’s game of life
 Typical implementation is full of indices and loops
(defn step
 "Takes a vector of vectors of 0 and 1, and
  returns the next iteration of the automaton."
 [board]
  (let [w (count board)
         h (count (first board))]
    (loop [i 0 j 0 new-board board]
      (cond
        (>= i w) new-board
        (>= j h) (recur (inc i) 0 new-board)
        :else
           (let [n (neighbours-count board i j)
                 nb (cond
                      (= 3 n) (assoc-in new-board [i j] 1)
                      (not= 2 n) (assoc-in new-board [i j] 0)
                      :else new-board)]
             (recur i (inc j) new-board))))))
Conway’s game of life
     And there’s more!



(defn neighbours-count [board i j]
  (let [i+1 (inc i) j+1 (inc j)]
    (loop [cnt 0 x (dec i) y (dec j)]
      (cond
        (> x i+1) cnt
        (> y j+1) (recur cnt (inc x) (dec j))
        (= [x y] [i j]) (recur cnt x (inc y))
        :else (recur (+ cnt (get-in board [x y] 0))
                     x (inc y))))))
Conway’s game of life
     And there’s more!



(defn neighbours-count [board i j]
  (let [i+1 (inc i) j+1 (inc j)]
    (loop [cnt 0 x (dec i) y (dec j)]
      (cond
        (> x i+1) cnt
        (> y j+1) (recur cnt (inc x) (dec j))
        (= [x y] [i j]) (recur cnt x (inc y))
        :else (recur (+ cnt (get-in board [x y] 0))
                     x (inc y))))))
Look, no indices
At each step in time, the following transitions occur:
•   Any live cell with fewer than two live neighbours
    dies, as if caused by under-population.
•   Any live cell with two or three live neighbours
    lives on to the next generation.
•   Any live cell with more than three live neighbours
    dies, as if by overcrowding.
•   Any dead cell with exactly three live neighbours
    becomes a live cell, as if by reproduction.
                                            (wikipedia)
Take a step back!
Look, no indices
At each step in time, the following transitions occur:
•   Any live cell with fewer than two live neighbours
    dies, as if caused by under-population.
•   Any live cell with two or three live neighbours
    lives on to the next generation.
•   Any live cell with more than three live
    neighbours dies, as if by overcrowding.
•   Any dead cell with exactly three live neighbours
    becomes a live cell, as if by reproduction.
                                            (wikipedia)
Neighbours!
Neighbours!
Try to express the rules in code using the
neighbours concept
Neighbours!
Try to express the rules in code using the
neighbours concept
Don’t worry about the implementation of
neighbours
Neighbours!
Neighbours!
For each living cell or neighbour of a living
cell, compute the number of neighbours.
Neighbours!
For each living cell or neighbour of a living
cell, compute the number of neighbours.
Then apply generation rules.
Neighbours!
Neighbours!
Compute all neighbours of the living cells.
Neighbours!
Compute all neighbours of the living cells.
Occurences count is neighbour count!
Neighbours!
Compute all neighbours of the living cells.
Occurences count is neighbour count!
Then apply generation rules.
Neighbours!


(defn step
  "Takes a set of living cells and returns the next
generation (as a set too)."
  [living-cells]
  (letfn [(alive [[cell cnt]]
            (when (or (= cnt 3)
                    (and (= cnt 2) (living-cells cell)))
              cell))]
    (->> living-cells (mapcat neighbours) frequencies
      (keep alive) set)))
Neighbours!


(defn step
  "Takes a set of living cells and returns the next
generation (as a set too)."
  [living-cells]
  (letfn [(alive [[cell cnt]]
            (when (or (= cnt 3)
                    (and (= cnt 2) (living-cells cell)))
              cell))]
    (->> living-cells (mapcat neighbours) frequencies
      (keep alive) set)))
Neighbours!
(defn neighbours [[x y]]
  (for [dx [-1 0 1]
        dy (if (zero? dx) [-1 1] [-1 0 1])]
    [(+ x dx) (+ y dy)]))


(defn step
  "Takes a set of living cells and returns the next
generation (as a set too)."
  [living-cells]
  (letfn [(alive [[cell cnt]]
            (when (or (= cnt 3)
                    (and (= cnt 2) (living-cells cell)))
              cell))]
    (->> living-cells (mapcat neighbours) frequencies
      (keep alive) set)))
Drafting code
Drafting code
Don’t go to the details
Drafting code
Don’t go to the details
Draft high-level code you’d like to be
able to write to solve the problem
Drafting code
Don’t go to the details
Draft high-level code you’d like to be
able to write to solve the problem
Try to implement it
Drafting code
Don’t go to the details
Draft high-level code you’d like to be
able to write to solve the problem
Try to implement it
Negociate between practicality of
implementation and draft code
But it really hurts...
But it really hurts...
Ask for help
But it really hurts...
Ask for help
 #clojure on IRC
But it really hurts...
Ask for help
 #clojure on IRC
 Stackoverflow
But it really hurts...
Ask for help
 #clojure on IRC
 Stackoverflow
 clojure google group
But it really hurts...
Ask for help
 #clojure on IRC
 Stackoverflow
 clojure google group
 reach your local user group
But it really hurts...
Ask for help
 #clojure on IRC
 Stackoverflow
 clojure google group
 reach your local user group
 create your local user group
But it really hurts...
Ask for help
 #clojure on IRC
 Stackoverflow
 clojure google group
 reach your local user group
 create your local user group
 mail me christophe@cgrand.net

Más contenido relacionado

La actualidad más candente

Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technology
ppparthpatel123
 
Regex Presentation
Regex PresentationRegex Presentation
Regex Presentation
arnolambert
 
Regular Expressions grep and egrep
Regular Expressions grep and egrepRegular Expressions grep and egrep
Regular Expressions grep and egrep
Tri Truong
 
Regular Expressions 101
Regular Expressions 101Regular Expressions 101
Regular Expressions 101
Raj Rajandran
 
Perl Xpath Lightning Talk
Perl Xpath Lightning TalkPerl Xpath Lightning Talk
Perl Xpath Lightning Talk
ddn123456
 
Perl programming language
Perl programming languagePerl programming language
Perl programming language
Elie Obeid
 

La actualidad más candente (20)

Bioinformatics p2-p3-perl-regexes v2014
Bioinformatics p2-p3-perl-regexes v2014Bioinformatics p2-p3-perl-regexes v2014
Bioinformatics p2-p3-perl-regexes v2014
 
Build a compiler using C#, Irony and RunSharp.
Build a compiler using C#, Irony and RunSharp.Build a compiler using C#, Irony and RunSharp.
Build a compiler using C#, Irony and RunSharp.
 
PHP Regular Expressions
PHP Regular ExpressionsPHP Regular Expressions
PHP Regular Expressions
 
Ruby -the wheel Technology
Ruby -the wheel TechnologyRuby -the wheel Technology
Ruby -the wheel Technology
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Was können wir von Rebol lernen?
Was können wir von Rebol lernen?Was können wir von Rebol lernen?
Was können wir von Rebol lernen?
 
Regex Presentation
Regex PresentationRegex Presentation
Regex Presentation
 
Bioinformatics p1-perl-introduction v2013
Bioinformatics p1-perl-introduction v2013Bioinformatics p1-perl-introduction v2013
Bioinformatics p1-perl-introduction v2013
 
Regular Expressions grep and egrep
Regular Expressions grep and egrepRegular Expressions grep and egrep
Regular Expressions grep and egrep
 
Regular Expressions
Regular ExpressionsRegular Expressions
Regular Expressions
 
Regular Expressions in PHP, MySQL by programmerblog.net
Regular Expressions in PHP, MySQL by programmerblog.netRegular Expressions in PHP, MySQL by programmerblog.net
Regular Expressions in PHP, MySQL by programmerblog.net
 
Regular Expressions 101
Regular Expressions 101Regular Expressions 101
Regular Expressions 101
 
Bioinformatics p2-p3-perl-regexes v2013-wim_vancriekinge
Bioinformatics p2-p3-perl-regexes v2013-wim_vancriekingeBioinformatics p2-p3-perl-regexes v2013-wim_vancriekinge
Bioinformatics p2-p3-perl-regexes v2013-wim_vancriekinge
 
Regular Expression
Regular ExpressionRegular Expression
Regular Expression
 
Pure and Declarative Syntax Definition: Paradise Lost and Regained
Pure and Declarative Syntax Definition: Paradise Lost and RegainedPure and Declarative Syntax Definition: Paradise Lost and Regained
Pure and Declarative Syntax Definition: Paradise Lost and Regained
 
Perl Xpath Lightning Talk
Perl Xpath Lightning TalkPerl Xpath Lightning Talk
Perl Xpath Lightning Talk
 
Automata theory -RE to NFA-ε
Automata theory -RE to  NFA-εAutomata theory -RE to  NFA-ε
Automata theory -RE to NFA-ε
 
Introduction to Regular Expressions
Introduction to Regular ExpressionsIntroduction to Regular Expressions
Introduction to Regular Expressions
 
Perl programming language
Perl programming languagePerl programming language
Perl programming language
 
Code Like Pythonista
Code Like PythonistaCode Like Pythonista
Code Like Pythonista
 

Destacado

Messaging With Erlang And Jabber
Messaging With  Erlang And  JabberMessaging With  Erlang And  Jabber
Messaging With Erlang And Jabber
l xf
 
VoltDB and Erlang - Tech planet 2012
VoltDB and Erlang - Tech planet 2012VoltDB and Erlang - Tech planet 2012
VoltDB and Erlang - Tech planet 2012
Eonblast
 

Destacado (20)

High Performance Erlang
High  Performance  ErlangHigh  Performance  Erlang
High Performance Erlang
 
Erlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-SubramanyaErlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-Subramanya
 
Winning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test CycleWinning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test Cycle
 
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)
 
Elixir talk
Elixir talkElixir talk
Elixir talk
 
20 reasons why we don't need architects (@pavlobaron)
20 reasons why we don't need architects (@pavlobaron)20 reasons why we don't need architects (@pavlobaron)
20 reasons why we don't need architects (@pavlobaron)
 
Clojure class
Clojure classClojure class
Clojure class
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 
Messaging With Erlang And Jabber
Messaging With  Erlang And  JabberMessaging With  Erlang And  Jabber
Messaging With Erlang And Jabber
 
From Perl To Elixir
From Perl To ElixirFrom Perl To Elixir
From Perl To Elixir
 
NDC London 2014: Erlang Patterns Matching Business Needs
NDC London 2014: Erlang Patterns Matching Business NeedsNDC London 2014: Erlang Patterns Matching Business Needs
NDC London 2014: Erlang Patterns Matching Business Needs
 
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
 
VoltDB and Erlang - Tech planet 2012
VoltDB and Erlang - Tech planet 2012VoltDB and Erlang - Tech planet 2012
VoltDB and Erlang - Tech planet 2012
 
Elixir for aspiring Erlang developers
Elixir for aspiring Erlang developersElixir for aspiring Erlang developers
Elixir for aspiring Erlang developers
 
Introduction to Erlang for Python Programmers
Introduction to Erlang for Python ProgrammersIntroduction to Erlang for Python Programmers
Introduction to Erlang for Python Programmers
 
Clojure Intro
Clojure IntroClojure Intro
Clojure Intro
 
Elixir Into Production
Elixir Into ProductionElixir Into Production
Elixir Into Production
 
Clojure, Plain and Simple
Clojure, Plain and SimpleClojure, Plain and Simple
Clojure, Plain and Simple
 
Erlang - Because S**t Happens
Erlang - Because S**t HappensErlang - Because S**t Happens
Erlang - Because S**t Happens
 
Clojure: Towards The Essence of Programming
Clojure: Towards The Essence of ProgrammingClojure: Towards The Essence of Programming
Clojure: Towards The Essence of Programming
 

Similar a Clojure values

Similar a Clojure values (20)

Programming_Language_Syntax.ppt
Programming_Language_Syntax.pptProgramming_Language_Syntax.ppt
Programming_Language_Syntax.ppt
 
Syntax
SyntaxSyntax
Syntax
 
Chapter-3 compiler.pptx course materials
Chapter-3 compiler.pptx course materialsChapter-3 compiler.pptx course materials
Chapter-3 compiler.pptx course materials
 
Module 11
Module 11Module 11
Module 11
 
Intro to Functional Programming
Intro to Functional ProgrammingIntro to Functional Programming
Intro to Functional Programming
 
Computational model language and grammar bnf
Computational model language and grammar bnfComputational model language and grammar bnf
Computational model language and grammar bnf
 
LVEE 2014: Text parsing with Python and PLY
LVEE 2014: Text parsing with Python and PLYLVEE 2014: Text parsing with Python and PLY
LVEE 2014: Text parsing with Python and PLY
 
Natural Language Processing and Python
Natural Language Processing and PythonNatural Language Processing and Python
Natural Language Processing and Python
 
Lexical 2
Lexical 2Lexical 2
Lexical 2
 
Spreadsheets for developers
Spreadsheets for developersSpreadsheets for developers
Spreadsheets for developers
 
Fundamental Unicode in Perl
Fundamental Unicode in PerlFundamental Unicode in Perl
Fundamental Unicode in Perl
 
Sequence to sequence (encoder-decoder) learning
Sequence to sequence (encoder-decoder) learningSequence to sequence (encoder-decoder) learning
Sequence to sequence (encoder-decoder) learning
 
Lda2vec text by the bay 2016 with notes
Lda2vec text by the bay 2016 with notesLda2vec text by the bay 2016 with notes
Lda2vec text by the bay 2016 with notes
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lisp
 
Regexp secrets
Regexp secretsRegexp secrets
Regexp secrets
 
04 Syntax Analysis.pdf
04 Syntax Analysis.pdf04 Syntax Analysis.pdf
04 Syntax Analysis.pdf
 
50 must know coding interview questions
50 must know coding interview questions50 must know coding interview questions
50 must know coding interview questions
 
Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Context
 
Types of parsers
Types of parsersTypes of parsers
Types of parsers
 
Declarative Syntax Definition - Pretty Printing
Declarative Syntax Definition - Pretty PrintingDeclarative Syntax Definition - Pretty Printing
Declarative Syntax Definition - Pretty Printing
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Clojure values