SlideShare a Scribd company logo
Pune Clojure Course Outline
Pune Clojure Course Outline
  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

PDF
Hadoop + Clojure
PDF
Hw09 Hadoop + Clojure
PDF
Clojure: The Art of Abstraction
PDF
Why Haskell
KEY
Clojure Intro
KEY
R for Pirates. ESCCONF October 27, 2011
PDF
Pragmatic Real-World Scala (short version)
PDF
Meet scala
Hadoop + Clojure
Hw09 Hadoop + Clojure
Clojure: The Art of Abstraction
Why Haskell
Clojure Intro
R for Pirates. ESCCONF October 27, 2011
Pragmatic Real-World Scala (short version)
Meet scala

What's hot (20)

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

Similar to Pune Clojure Course Outline (20)

PDF
Clojure - An Introduction for Lisp Programmers
KEY
(map Clojure everyday-tasks)
PDF
Introduction to clojure
PDF
(first '(Clojure.))
PPTX
Clojure 7-Languages
PDF
I know Java, why should I consider Clojure?
PDF
Clojure Interoperability
PDF
Clojure - A new Lisp
PDF
Clojure A Dynamic Programming Language for the JVM
PDF
Clojure values
PDF
Continuation Passing Style and Macros in Clojure - Jan 2012
PDF
Stefan Kanev: Clojure, ClojureScript and Why They're Awesome at I T.A.K.E. Un...
ODP
Clojure made simple - Lightning talk
PDF
Thinking Functionally with Clojure
PDF
Thinking Functionally - John Stevenson - Codemotion Rome 2017
PDF
Clojure: Simple By Design
ODP
Getting started with Clojure
PDF
Clojure made-simple - John Stevenson
PDF
A gentle introduction to functional programming through music and clojure
ODP
Clojure: Practical functional approach on JVM
Clojure - An Introduction for Lisp Programmers
(map Clojure everyday-tasks)
Introduction to clojure
(first '(Clojure.))
Clojure 7-Languages
I know Java, why should I consider Clojure?
Clojure Interoperability
Clojure - A new Lisp
Clojure A Dynamic Programming Language for the JVM
Clojure values
Continuation Passing Style and Macros in Clojure - Jan 2012
Stefan Kanev: Clojure, ClojureScript and Why They're Awesome at I T.A.K.E. Un...
Clojure made simple - Lightning talk
Thinking Functionally with Clojure
Thinking Functionally - John Stevenson - Codemotion Rome 2017
Clojure: Simple By Design
Getting started with Clojure
Clojure made-simple - John Stevenson
A gentle introduction to functional programming through music and clojure
Clojure: Practical functional approach on JVM
Ad

Recently uploaded (20)

PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Tartificialntelligence_presentation.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
Spectroscopy.pptx food analysis technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
1. Introduction to Computer Programming.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
Group 1 Presentation -Planning and Decision Making .pptx
Heart disease approach using modified random forest and particle swarm optimi...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
NewMind AI Weekly Chronicles - August'25-Week II
Spectral efficient network and resource selection model in 5G networks
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Encapsulation_ Review paper, used for researhc scholars
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Tartificialntelligence_presentation.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
A comparative study of natural language inference in Swahili using monolingua...
Building Integrated photovoltaic BIPV_UPV.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Spectroscopy.pptx food analysis technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
Programs and apps: productivity, graphics, security and other tools
1. Introduction to Computer Programming.pptx
MIND Revenue Release Quarter 2 2025 Press Release

Pune Clojure Course Outline

  • 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