SlideShare a Scribd company logo
1 of 32
Download to read offline
  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

More Related Content

What's hot

Demystifying functional programming with Scala
Demystifying functional programming with ScalaDemystifying functional programming with Scala
Demystifying functional programming with ScalaDenis
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meetMario Fusco
 
If You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are WrongIf You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are WrongMario Fusco
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data ScienceMike Anderson
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introductionelliando dias
 
Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Kel Cecil
 
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...John De Goes
 
All Aboard The Scala-to-PureScript Express!
All Aboard The Scala-to-PureScript Express!All Aboard The Scala-to-PureScript Express!
All Aboard The Scala-to-PureScript Express!John De Goes
 
Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedSusan Potter
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl BytecodeDonal Fellows
 
Spark 4th Meetup Londond - Building a Product with Spark
Spark 4th Meetup Londond - Building a Product with SparkSpark 4th Meetup Londond - Building a Product with Spark
Spark 4th Meetup Londond - Building a Product with Sparksamthemonad
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Sciencehenrygarner
 
Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5Donal Fellows
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real Worldosfameron
 

What's hot (20)

Demystifying functional programming with Scala
Demystifying functional programming with ScalaDemystifying functional programming with Scala
Demystifying functional programming with Scala
 
Scala - where objects and functions meet
Scala - where objects and functions meetScala - where objects and functions meet
Scala - where objects and functions meet
 
If You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are WrongIf You Think You Can Stay Away from Functional Programming, You Are Wrong
If You Think You Can Stay Away from Functional Programming, You Are Wrong
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Science
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introduction
 
Enter The Matrix
Enter The MatrixEnter The Matrix
Enter The Matrix
 
MTL Versus Free
MTL Versus FreeMTL Versus Free
MTL Versus Free
 
Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!
 
Collections forceawakens
Collections forceawakensCollections forceawakens
Collections forceawakens
 
Clojure class
Clojure classClojure class
Clojure class
 
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...
The Easy-Peasy-Lemon-Squeezy, Statically-Typed, Purely Functional Programming...
 
All Aboard The Scala-to-PureScript Express!
All Aboard The Scala-to-PureScript Express!All Aboard The Scala-to-PureScript Express!
All Aboard The Scala-to-PureScript Express!
 
Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids Applied
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl Bytecode
 
Spark 4th Meetup Londond - Building a Product with Spark
Spark 4th Meetup Londond - Building a Product with SparkSpark 4th Meetup Londond - Building a Product with Spark
Spark 4th Meetup Londond - Building a Product with Spark
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Science
 
Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5Making an Object System with Tcl 8.5
Making an Object System with Tcl 8.5
 
Comparing JVM languages
Comparing JVM languagesComparing JVM languages
Comparing JVM languages
 
Sneaking inside Kotlin features
Sneaking inside Kotlin featuresSneaking inside Kotlin features
Sneaking inside Kotlin features
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 

Similar to Pune Clojure Course Outline

Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with ClojureJohn Stevenson
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the webMichiel Borkent
 
Exploring Clojurescript
Exploring ClojurescriptExploring Clojurescript
Exploring ClojurescriptLuke Donnet
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 
The Curious Clojurist - Neal Ford (Thoughtworks)
The Curious Clojurist - Neal Ford (Thoughtworks)The Curious Clojurist - Neal Ford (Thoughtworks)
The Curious Clojurist - Neal Ford (Thoughtworks)jaxLondonConference
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015Michiel Borkent
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)Jacek Laskowski
 
(first '(Clojure.))
(first '(Clojure.))(first '(Clojure.))
(first '(Clojure.))niklal
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011Thadeu Russo
 
Introduction to R
Introduction to RIntroduction to R
Introduction to Ragnonchik
 
Real Time Big Data Management
Real Time Big Data ManagementReal Time Big Data Management
Real Time Big Data ManagementAlbert Bifet
 
Леонид Шевцов «Clojure в деле»
Леонид Шевцов «Clojure в деле»Леонид Шевцов «Clojure в деле»
Леонид Шевцов «Clojure в деле»DataArt
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John StevensonJAX London
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?Tomasz Wrobel
 

Similar to Pune Clojure Course Outline (20)

Full Stack Clojure
Full Stack ClojureFull Stack Clojure
Full Stack Clojure
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with Clojure
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
 
Exploring Clojurescript
Exploring ClojurescriptExploring Clojurescript
Exploring Clojurescript
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
The Curious Clojurist - Neal Ford (Thoughtworks)
The Curious Clojurist - Neal Ford (Thoughtworks)The Curious Clojurist - Neal Ford (Thoughtworks)
The Curious Clojurist - Neal Ford (Thoughtworks)
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)
 
(first '(Clojure.))
(first '(Clojure.))(first '(Clojure.))
(first '(Clojure.))
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011
 
Introduction to R
Introduction to RIntroduction to R
Introduction to R
 
Java
JavaJava
Java
 
Real Time Big Data Management
Real Time Big Data ManagementReal Time Big Data Management
Real Time Big Data Management
 
Clojure intro
Clojure introClojure intro
Clojure intro
 
Леонид Шевцов «Clojure в деле»
Леонид Шевцов «Clojure в деле»Леонид Шевцов «Clojure в деле»
Леонид Шевцов «Clojure в деле»
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
C# programming
C# programming C# programming
C# programming
 

Recently uploaded

Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
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...apidays
 
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?Igalia
 
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...Drew Madelung
 
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)wesley chun
 

Recently uploaded (20)

Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
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...
 
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?
 
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...
 
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)
 

Pune Clojure Course Outline

  • 1.
  • 2.
  • 3.   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)
  • 4.   History   Metadata   Data Structures   Java Inter-op   Syntax   Concurrency   Functions   Multi-methods   Sequences   Macros   Namespaces   Clojure Contrib
  • 5.   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!
  • 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 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
  • 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 better to have 100 functions operate on one data structure than 10 functions on 10 data-structures.” Alan J. Perlis
  • 12.   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
  • 13.   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
  • 14.   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}  
  • 15.   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
  • 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 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)  
  • 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 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
  • 25.   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)  
  • 26.   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]))    
  • 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