  Programming Language Nerd

  Co-founder & CTO, Infinitely Beta

  Clojure programmer since the early
   days

  Curator of Planet Clojure

  Author of “Clojure in Practice” (ETA
   Sep, 2011)
  History             Metadata

  Data Structures     Java Inter-op

  Syntax              Concurrency

  Functions           Multi-methods

  Sequences           Macros

  Namespaces          Clojure Contrib
  Created by Rich Hickey in
   2007
  Open Sourced in 2008
  First large deployment in Jan,
   2009

  Second in Apr, same year
  We’ve come a long way since
   then!
  Programming languages      OO is overrated
   haven’t really changed
   much                       Polymorphism is good

  Creating large-scale,      Multi-core is the future
   concurrent software is
   still hard                 VMs are the next-gen
                               platforms
  Functional Programming
   rocks                      Ecosystem matters

  Lisp is super power        Dynamic development
  Numbers 1	
  3.14	
  22/7	
       Characters a	
  b	
  c	
  
  Booleans true	
  false	
          Comments ;;	
  Ignore	
  

  Strings “foobar”	
                Nothing nil	
  
  Symbols thisfn	
  

  Keywords :this	
  :that	
  
  RegEx Patterns #“[a-­‐zA-­‐
    Z0-­‐9]+”	
  
  Lists (1	
  2	
  3)	
  (list	
  “foo”	
  “bar”	
  “baz”)	
  

  Vectors [1	
  2	
  3]	
  (vector	
  “foo”	
  “bar”	
  “baz”)	
  

  Maps {:x	
  1,	
  :y	
  2}	
  (hash-­‐map	
  :foo	
  1	
  :bar	
  2)	
  

  Sets #{a	
  e	
  i	
  o	
  u}	
  (hash-­‐set	
  “cat”	
  “dog”)	
  
  There is no other syntax!
  Data structures are the code
  No other text based syntax, only different
   interpretations
  Everything is an expression (s-exp)
  All data literals stand for themselves, except symbols &
   lists
  Function calls (function	
  arguments*)	
  


(def	
  hello	
  (fn	
  []	
  “Hello,	
  world!”))	
  
-­‐>	
  #’user/hello	
  
(hello)	
  
-­‐>	
  “Hello,	
  world!”	
  

(defn	
  hello	
  
	
  	
  ([]	
  (hello	
  “world”))	
  
	
  	
  ([name]	
  (str	
  “Hello,	
  ”	
  name	
  “!”)))	
  
“It is better to have 100 functions operate on one data structure
             than 10 functions on 10 data-structures.”
                          Alan J. Perlis
  An abstraction over traditional Lisp lists

  Provides an uniform way of walking through different
   data-structures

  Sample sequence functions seq	
  first	
  rest	
  filter	
  
    remove	
  for	
  partition	
  reverse	
  sort	
  map	
  reduce	
  doseq
  Analogous to Java packages, but with added dynamism

  A mapping of symbols to actual vars/classes

  Can be queried and modified dynamically

  Usually manipulated via the ns macro
  Data about data

  Can annotate any symbol or collection

  Mainly used by developers to mark data structures with
   some special information

  Clojure itself uses it heavily

(def	
  x	
  (with-­‐meta	
  {:x	
  1}	
  {:source	
  :provider-­‐1}))	
  
-­‐>	
  #’user/x	
  
(meta	
  x)	
  
-­‐>	
  {:source	
  :provider-­‐1}	
  
  Wrapper free interface to Java
  Syntactic sugar makes calling Java easy & readable
  Core Clojure abstractions are Java interfaces (will
   change)
  Clojure functions implement Callable & Runnable
  Clojure sequence lib works with Java iterables
  Near native speed
(ClassName.	
  args*)	
  
(instanceMember	
  instance	
  args*)	
  
(ClassName/staticMethod	
  args*)	
  
ClassName/STATIC_FIELD	
  

(.toUpperCase	
  “clojure”)	
  
-­‐>	
  “CLOJURE”	
  
(System/getProperty	
  “java.vm.version”)	
  
-­‐>	
  “16.3-­‐b01-­‐279”	
  
Math/PI	
  
-­‐>	
  3.14…	
  
(..	
  System	
  (getProperties)	
  (get	
  “os.name”))	
  
-­‐>	
  “Mac	
  OS	
  X”	
  
  A technique of doing structural binding in a function
   arg list or let binding



(defn	
  list-­‐xyz	
  [xyz-­‐map]	
  
	
  	
  (list	
  (:x	
  xyz-­‐map)	
  (:y	
  xyz-­‐map)	
  (:z	
  xyz-­‐map)))	
  

(list-­‐xyz	
  {:x	
  1,	
  :y	
  2	
  :z	
  3})	
  
-­‐>	
  (1	
  2	
  3)	
  
//	
  From	
  Apache	
  Commons	
  Lang,	
  http://commons.apache.org/lang/	
  
	
  	
  public	
  static	
  int	
  indexOfAny(String	
  str,	
  char[]	
  searchChars)	
  {	
  
	
  	
  	
  	
  	
  	
  if	
  (isEmpty(str)	
  ||	
  ArrayUtils.isEmpty(searchChars))	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  -­‐1;	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  for	
  (int	
  i	
  =	
  0;	
  i	
  <	
  str.length();	
  i++)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  char	
  ch	
  =	
  str.charAt(i);	
  
	
  	
  	
  	
  	
  	
  	
  	
  for	
  (int	
  j	
  =	
  0;	
  j	
  <	
  searchChars.length;	
  j++)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  (searchChars[j]	
  ==	
  ch)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  i;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  return	
  -­‐1;	
  
	
  	
  }	
  
(defn	
  indexed	
  [coll]	
  (map	
  vector	
  (iterate	
  inc	
  0)	
  coll))	
  
(defn	
  indexed	
  [coll]	
  (map	
  vector	
  (iterate	
  inc	
  0)	
  coll))	
  

(defn	
  index-­‐filter	
  [pred	
  coll]	
  
	
  	
  	
  	
  (for	
  [[idx	
  elt]	
  (indexed	
  coll)	
  :when	
  (pred	
  elt)]	
  
	
  	
  	
  	
  	
  	
  idx))	
  
(defn	
  indexed	
  [coll]	
  (map	
  vector	
  (iterate	
  inc	
  0)	
  coll))	
  

(defn	
  index-­‐filter	
  [pred	
  coll]	
  
	
  	
  	
  	
  (when	
  pred	
  	
  
	
  	
  	
  	
  	
  	
  (for	
  [[idx	
  elt]	
  (indexed	
  coll)	
  :when	
  (pred	
  elt)]	
  idx)))	
  

(index-­‐filter	
  #{a	
  e	
  i	
  o	
  o}	
  "The	
  quick	
  brown	
  fox")	
  
-­‐>	
  (2	
  6	
  12	
  17)	
  

(index-­‐filter	
  #(>	
  (.length	
  %)	
  3)	
  ["The"	
  "quick"	
  "brown"	
  "fox"])	
  
-­‐>	
  (1	
  2)	
  
for	
   doseq	
   if	
   cond	
   condp	
   partition	
   loop	
   recur	
   str	
   map	
  
reduce	
   filter	
   defmacro	
   apply	
   comp	
   complement	
  	
  
defstruct	
   drop	
   drop-­‐last	
   drop-­‐while	
   format	
   iterate	
  
juxt	
   map	
   mapcat	
   memoize	
   merge	
   partial	
   partition	
  
partition-­‐all	
   re-­‐seq	
   reductions	
   reduce	
   remove	
   repeat	
  
repeatedly	
  zipmap	
  
  Simultaneous execution

  Avoid reading; yielding inconsistent data

                      Synchronous    Asynchronous
      Coordinated     ref	
  
      Independent     atom	
         agent	
  
      Unshared        var	
  
  Generalised indirect dispatch

  Dispatch on an arbitrary function of the arguments

  Call sequence
     Call dispatch function on args to get dispatch value
     Find method associated with dispatch value
        Else call default method
        Else error
  Encapsulation through closures

  Polymorphism through multi-methods

  Inheritance through duck-typing
(defmulti	
  interest	
  :type)	
  
(defmethod	
  interest	
  :checking	
  [a]	
  0)	
  
(defmethod	
  interest	
  :savings	
  [a]	
  0.05)	
  

(defmulti	
  service-­‐charge	
  	
  
	
  	
  	
  	
  (fn	
  [acct]	
  [(account-­‐level	
  acct)	
  (:tag	
  acct)]))	
  
(defmethod	
  service-­‐charge	
  [::Basic	
  ::Checking]	
  	
  	
  [_]	
  25)	
  	
  
(defmethod	
  service-­‐charge	
  [::Basic	
  ::Savings]	
  	
  	
  	
  [_]	
  10)	
  
(defmethod	
  service-­‐charge	
  [::Premium	
  ::Checking]	
  [_]	
  0)	
  
(defmethod	
  service-­‐charge	
  [::Premium	
  ::Savings]	
  	
  [_]	
  0)	
  
  A facility to extend the compiler with user code

  Used to define syntactic constructs which would
   otherwise require primitives/built-in support


 (try-­‐or	
  
 	
  	
  (/	
  1	
  0)	
  
 	
  	
  (reduce	
  +	
  [1	
  2	
  3	
  4])	
  
 	
  	
  (partition	
  (range	
  10)	
  2)	
  
 	
  	
  (map	
  +	
  [1	
  2	
  3	
  4]))	
  	
  
  clojure.contrib.http.agent

  clojure.contrib.io

  clojure.contrib.json

  clojure.contrib.seq-utils

  clojure.contrib.pprint

  clojure.contrib.string
  Compojure          Cascalog

  ClojureQL          Enlive

  Incanter           Congomongo

  Leiningen          Pallet

  FleetDB            Many more!

  clojure-hadoop
  Clojure http://clojure.org

  Clojure group http://bit.ly/clojure-group

  IRC #clojure on irc.freenode.net

  Source http://github.com/clojure

  Wikibook http://bit.ly/clojure-wikibook
http://infinitelybeta.com/jobs/
Pune Clojure Course Outline
Pune Clojure Course Outline

Pune Clojure Course Outline

  • 3.
      Programming LanguageNerd   Co-founder & CTO, Infinitely Beta   Clojure programmer since the early days   Curator of Planet Clojure   Author of “Clojure in Practice” (ETA Sep, 2011)
  • 4.
      History   Metadata   Data Structures   Java Inter-op   Syntax   Concurrency   Functions   Multi-methods   Sequences   Macros   Namespaces   Clojure Contrib
  • 5.
      Created byRich Hickey in 2007   Open Sourced in 2008   First large deployment in Jan, 2009   Second in Apr, same year   We’ve come a long way since then!
  • 6.
      Programming languages   OO is overrated haven’t really changed much   Polymorphism is good   Creating large-scale,   Multi-core is the future concurrent software is still hard   VMs are the next-gen platforms   Functional Programming rocks   Ecosystem matters   Lisp is super power   Dynamic development
  • 7.
      Numbers 1  3.14  22/7     Characters a  b  c     Booleans true  false     Comments ;;  Ignore     Strings “foobar”     Nothing nil     Symbols thisfn     Keywords :this  :that     RegEx Patterns #“[a-­‐zA-­‐ Z0-­‐9]+”  
  • 8.
      Lists (1  2  3)  (list  “foo”  “bar”  “baz”)     Vectors [1  2  3]  (vector  “foo”  “bar”  “baz”)     Maps {:x  1,  :y  2}  (hash-­‐map  :foo  1  :bar  2)     Sets #{a  e  i  o  u}  (hash-­‐set  “cat”  “dog”)  
  • 9.
      There isno other syntax!   Data structures are the code   No other text based syntax, only different interpretations   Everything is an expression (s-exp)   All data literals stand for themselves, except symbols & lists
  • 10.
      Function calls(function  arguments*)   (def  hello  (fn  []  “Hello,  world!”))   -­‐>  #’user/hello   (hello)   -­‐>  “Hello,  world!”   (defn  hello      ([]  (hello  “world”))      ([name]  (str  “Hello,  ”  name  “!”)))  
  • 11.
    “It is betterto have 100 functions operate on one data structure than 10 functions on 10 data-structures.” Alan J. Perlis
  • 12.
      An abstractionover traditional Lisp lists   Provides an uniform way of walking through different data-structures   Sample sequence functions seq  first  rest  filter   remove  for  partition  reverse  sort  map  reduce  doseq
  • 13.
      Analogous toJava packages, but with added dynamism   A mapping of symbols to actual vars/classes   Can be queried and modified dynamically   Usually manipulated via the ns macro
  • 14.
      Data aboutdata   Can annotate any symbol or collection   Mainly used by developers to mark data structures with some special information   Clojure itself uses it heavily (def  x  (with-­‐meta  {:x  1}  {:source  :provider-­‐1}))   -­‐>  #’user/x   (meta  x)   -­‐>  {:source  :provider-­‐1}  
  • 15.
      Wrapper freeinterface to Java   Syntactic sugar makes calling Java easy & readable   Core Clojure abstractions are Java interfaces (will change)   Clojure functions implement Callable & Runnable   Clojure sequence lib works with Java iterables   Near native speed
  • 16.
    (ClassName.  args*)   (instanceMember  instance  args*)   (ClassName/staticMethod  args*)   ClassName/STATIC_FIELD   (.toUpperCase  “clojure”)   -­‐>  “CLOJURE”   (System/getProperty  “java.vm.version”)   -­‐>  “16.3-­‐b01-­‐279”   Math/PI   -­‐>  3.14…   (..  System  (getProperties)  (get  “os.name”))   -­‐>  “Mac  OS  X”  
  • 17.
      A techniqueof doing structural binding in a function arg list or let binding (defn  list-­‐xyz  [xyz-­‐map]      (list  (:x  xyz-­‐map)  (:y  xyz-­‐map)  (:z  xyz-­‐map)))   (list-­‐xyz  {:x  1,  :y  2  :z  3})   -­‐>  (1  2  3)  
  • 18.
    //  From  Apache  Commons  Lang,  http://commons.apache.org/lang/      public  static  int  indexOfAny(String  str,  char[]  searchChars)  {              if  (isEmpty(str)  ||  ArrayUtils.isEmpty(searchChars))  {                  return  -­‐1;              }              for  (int  i  =  0;  i  <  str.length();  i++)  {                  char  ch  =  str.charAt(i);                  for  (int  j  =  0;  j  <  searchChars.length;  j++)  {                      if  (searchChars[j]  ==  ch)  {                          return  i;                      }                  }              }              return  -­‐1;      }  
  • 19.
    (defn  indexed  [coll]  (map  vector  (iterate  inc  0)  coll))  
  • 20.
    (defn  indexed  [coll]  (map  vector  (iterate  inc  0)  coll))   (defn  index-­‐filter  [pred  coll]          (for  [[idx  elt]  (indexed  coll)  :when  (pred  elt)]              idx))  
  • 21.
    (defn  indexed  [coll]  (map  vector  (iterate  inc  0)  coll))   (defn  index-­‐filter  [pred  coll]          (when  pred                (for  [[idx  elt]  (indexed  coll)  :when  (pred  elt)]  idx)))   (index-­‐filter  #{a  e  i  o  o}  "The  quick  brown  fox")   -­‐>  (2  6  12  17)   (index-­‐filter  #(>  (.length  %)  3)  ["The"  "quick"  "brown"  "fox"])   -­‐>  (1  2)  
  • 22.
    for   doseq   if   cond   condp   partition   loop   recur   str   map   reduce   filter   defmacro   apply   comp   complement     defstruct   drop   drop-­‐last   drop-­‐while   format   iterate   juxt   map   mapcat   memoize   merge   partial   partition   partition-­‐all   re-­‐seq   reductions   reduce   remove   repeat   repeatedly  zipmap  
  • 23.
      Simultaneous execution  Avoid reading; yielding inconsistent data Synchronous Asynchronous Coordinated ref   Independent atom   agent   Unshared var  
  • 24.
      Generalised indirectdispatch   Dispatch on an arbitrary function of the arguments   Call sequence   Call dispatch function on args to get dispatch value   Find method associated with dispatch value   Else call default method   Else error
  • 25.
      Encapsulation throughclosures   Polymorphism through multi-methods   Inheritance through duck-typing (defmulti  interest  :type)   (defmethod  interest  :checking  [a]  0)   (defmethod  interest  :savings  [a]  0.05)   (defmulti  service-­‐charge            (fn  [acct]  [(account-­‐level  acct)  (:tag  acct)]))   (defmethod  service-­‐charge  [::Basic  ::Checking]      [_]  25)     (defmethod  service-­‐charge  [::Basic  ::Savings]        [_]  10)   (defmethod  service-­‐charge  [::Premium  ::Checking]  [_]  0)   (defmethod  service-­‐charge  [::Premium  ::Savings]    [_]  0)  
  • 26.
      A facilityto extend the compiler with user code   Used to define syntactic constructs which would otherwise require primitives/built-in support (try-­‐or      (/  1  0)      (reduce  +  [1  2  3  4])      (partition  (range  10)  2)      (map  +  [1  2  3  4]))    
  • 27.
      clojure.contrib.http.agent   clojure.contrib.io  clojure.contrib.json   clojure.contrib.seq-utils   clojure.contrib.pprint   clojure.contrib.string
  • 28.
      Compojure   Cascalog   ClojureQL   Enlive   Incanter   Congomongo   Leiningen   Pallet   FleetDB   Many more!   clojure-hadoop
  • 29.
      Clojure http://clojure.org  Clojure group http://bit.ly/clojure-group   IRC #clojure on irc.freenode.net   Source http://github.com/clojure   Wikibook http://bit.ly/clojure-wikibook
  • 30.