SlideShare a Scribd company logo
( s im p le
   ( c lo ju r e ) )

C lo ju r e m a d e
     s im p le
                       Ta l k
W h a t is
C lo ju r e
Clojure made simple - Lightning talk
Clojure made simple - Lightning talk
Clojure is small and flexible
Clojure concepts
Encourages Pure Functional approach
- use STM to change state


Functions as first class citizens
  - functions as arguments as they return a value


Make JVM interoperation simple
  - easy to use your existing Java applications
A better Lisp !
Sensible () usage


Sensible macro names


JVM Interoperability
Which LISP is your wingman ?
Common Lisp        Clojure
The dark side of Clojure



         ( x )
The dark side of Clojure



      ( ( x ) )
The dark side of Clojure



    ( ( ( x ) ) )
The dark side of Clojure



 ( ( ( ( x ) ) ) )
The dark side of Clojure



( ( ( ( ( x ) ) ) ) )
...verses non-lisp languages




      ( ) ==
     { ( ) };
Well nearly....


 ([] ((())))
        ==
{ ( {( []) }) };
C o m p a r in g
    J a va
    w it h
  C lo ju r e
It s a ll b y t e c o d e in t h e
               e nd ..
Any object in clojure is just a regular java object




A reference type inheriting from:
         j ava. l ang. obj ec t
Clojure made simple - Lightning talk
B a s ic
C lo ju r e
S yn ta x
Name-spaces
; Define a namespace
  ( ns nam s pac e- nam
          e-           e)

; Include namespace code
  ( us e ' nam - s pac e- nam
              es             e)

Groups code together like a package statement
 in Java
Defining a function
 First principles            Syntactic Sugar
 ( def nam   e               ( def n nam e
    ( f n [ ar gs ]            [ ar gs ]
      ( f unc t i on- body      ( f unc t i on-
   …) )
    )                          body . . . ) )

( def n w c om m s age [ nam ]
           el      e- es             e
   ( pr i nt l n ( s t r “ W c om t o Cl oj ur e ”
                            el   e
nam )e)
Special forms
Special evaluation rules for the Clojure compiler
  - part of the language definition


catch, def, do, dot ('.'), finally, fn, if, let, loop,
  monitor-enter, monitor-exit, new, quote,
  recur, set!, throw, try and var
Simple function example
Define a simple function

( def n hel l o- w l d [ nam
                      or          e]
   ( pr i nt l n( s t r " Hel l o "
  nam ) )
      e)

Call the function in the REPL or in your code
( hel l o- w l d " j r 0c ket " )
            or
Prefix notation



( def n s quar e- t he- number
  [ x]
    ( * x x) )
“Overloading” functions

( def n make
   ([ ]    ; do       t h e f o l l o wi n g f u n c t i o n i f
 n o ar g s

        ( s t r uc t vec t or 0 0) )
     ( [ x y]        ; d o i f x an d y ar e
 ar g u me n t s

         ( s t r uc t vec t or x y) )
 )
Im m u t a b le
    D a ta
s truc ture s
List – Ordered collection

( l i s t 1 3 5 7)

' ( 1 3 5 7)

 ( 1 2 3) ; 1 i s n o t a
  f unct i on
Vectors – hashed ordered list
[ : m r i x- c har ac t er s [ : neo
     at
   : m pheus : t r i ni t y : s m t h] ]
      or                          i


( f i r s t [ : n e o : mo r p h e u s : t r i n i t y
   : s mi t h ] )


( nt h [ : mat r i x : b ab yl o n 5 : f i r e f l y
  : s t ar g at e ] 2 )


( c onc at [ : n e o ] [ : t r i n i t y] )
Maps – unordered key/values
{ : a 1 : b 2}                                { : a { : a 1} }
    { : a 1 , : b 2}                             {: a {: a 1}}


{ :a 1 :b }                                   { { : a 1} : a}
j ava. l an g . Ar r ayI n d e x Ou t Of Bo      { { : a 1 } : a}
   u n d s Ex c e p t i o n : 3
                                              ; i d i om - put : a on t he
                                                left
{ : a 1 : b 2}
    { : a 1 , : b 2}
L is t s a r e f o r
       c ode

Ve c t o r s a r e
  fo r d a ta
Working with data
(last [1 1 2 3 5 8])        (doc last)


(defn penultimate [x]
 (last (butlast x)) )       (doc butlast)


(penultimate [1 2 3 4 5])
And more...
(nth [1 1 2 3 5 8] 2)


(count [1 1 2 3 5 8])


(reverse [1 1 2 3 5 8])


(defn palindrome? [x]     Proposition – naming
 (= x (reverse x)) )       convention
Even more
(flatten [[1 1] 2 [3 [5 8]]])


(compress "aaaabccaadeeee")


(encode "aaaabccaadeeee")


(replicate 10 "a")
Defining a data structure
( def m dat a- s t r uc t ur e
        y-
 [ dat a ] )

( def days - of - t he- week
  [ “Monday” “ Tues day”
 “W ednes day” ] )
Example data structure


( def j r 0c ket
   { : f i r s t - nam " J ohn" ,
                      e

    : l as t - name
 " St evens on" } )
G e t c o d in g !
c lo ju r e .
           org
d o c s . c lo ju r
     e .o rg
All hail the REPL
An interactive shell for
 clojure

Fast feedback loop
 for clojure
Clojure made simple - Lightning talk
Clojure made simple - Lightning talk
M a n a g in g a
   c lo ju r e
   p r o je c t
Maven
Just like any other Java project


Step 1)
Add Clojure library jar to your POM


Step 2)
Download the Internet !!!
le in in g e n
   Leiningen
                               .o rg




lein new     Create a new clojure project
lein deps    Download all dependencies
lein repl    Start the interactive shell (repl)
lein swank   Start repl server
Clojure made simple - Lightning talk
Ema c s
Clojure made simple - Lightning talk
Clojure made simple - Lightning talk
A fe w
in t e r e s t in g
   C lo ju r e
 e x a m p le s
str
(str h e l l o)         Concatenate strings
                              together
                               represent a
                                 character using 


(def data “boo”)             Join arguments with
(str “message” data )          strings
Ratio
Unique data type            ( / 3 5)
                            ( / 3. 0
Allow lazy evaluation
                              5)
Avoid loss of precision
                            (/ 1 3)
                            (/ 1.0 3)

                            (class (/ 1
Calling Java... ooooo!!
( j avax . s wi n g . JOp t i o n Pan e /
    s h o wMe s s ag e D i al o g n i l
        " He l l o W r l d " )
                     o
Importing Java into Clojure
( ns dr aw ng- dem
          i       o
   ( : i m t [ j avax. s w ng J panel
          por             i
 J Fr am  e]
            [ j ava. awt
 Di m i on] ) )
     ens
Working with Java
Java Classes
  fullstop after class name
  ( J Fr am )
           e.
  (Math/cos 3) ; static method call

Java methods
  fullstop before method name
  ( . get Cont ent Pane f r am ;;method name first
                              e)
  ( . f r am get Cont ent Pane) ;;object first
            e
What class is that...
(class (str "Jr0cket"))
java.lang.String


(class (defn hello-world [name] (str "Hello
  cruel world")))
clojure.lang.Var
Clojure calling Java web stuff
( l et [ c onn]
    ( dot o ( Ht t pUr l Connec t i on.
  Ur l )
       ( . s et Reques t M hod
                          et
     “ POST” )
       ( . s et DoOut put t r ue)

   ( . s et I ns t aneFol l ow   Redi r ec t
   s                 t r ue) ) ] )
Recursive functions
Functions that call   Tail recursion
 themselves           Avoids blowing the
                       stack
Fractal coding
                      A trick as the JVM does
                       not support tail
                       recursion directly :-(
Tail recursion
( def n r ec ur s i ve- c ount er
   ( pr i nt ans w )er
   ( i f ( < ans w  er 1000)
     (   r ec ur   ( + ans wer 4) ) ) )
Where to find out more...


c l oj ur e. or g/ c heat s h
             eet
M u t a b le S t a t e
Software Transactional Memory

Provides safe, concurrent access to memory


Agents allow encapsulated access to mutable
 resources
Functional for the web
Big blog of stuff in > Big blob of stuff out


Encourages modularising responsibilities


Good at processing data in parallel
Noir   w e b n o ir . o r g
M o re to
             c o m e ...
          c l oj ur e. or g
       dev. c l oj ur e. or g

              @ r 0c ket
               j
c l oj ur e. j r 0c ket . c o

More Related Content

ODP
Clojure made really really simple
PDF
What can be done with Java, but should better be done with Erlang (@pavlobaron)
PDF
Clojure for Java developers - Stockholm
PDF
JavaOne 2013 - Clojure for Java Developers
KEY
Clojure Intro
ODP
Clojure: Practical functional approach on JVM
KEY
Alfresco the clojure way
PDF
Full Stack Clojure
Clojure made really really simple
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Clojure for Java developers - Stockholm
JavaOne 2013 - Clojure for Java Developers
Clojure Intro
Clojure: Practical functional approach on JVM
Alfresco the clojure way
Full Stack Clojure

What's hot (20)

PDF
Rust Mozlando Tutorial
ZIP
Oral presentation v2
PDF
Fun never stops. introduction to haskell programming language
PPT
Euro python2011 High Performance Python
PDF
Python Performance 101
PDF
A CTF Hackers Toolbox
PPT
Profiling and optimization
PDF
Tcl2012 8.6 Changes
PDF
ClojureScript loves React, DomCode May 26 2015
PDF
ClojureScript for the web
PDF
Clojure 1.1 And Beyond
PPTX
iSoligorsk #3 2013
PDF
The TclQuadcode Compiler
PDF
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
PDF
Python and sysadmin I
ODP
Ast transformations
PDF
The Magnificent Seven
PDF
Introduction to clojure
PPTX
Adventures in TclOO
ODP
Naïveté vs. Experience
Rust Mozlando Tutorial
Oral presentation v2
Fun never stops. introduction to haskell programming language
Euro python2011 High Performance Python
Python Performance 101
A CTF Hackers Toolbox
Profiling and optimization
Tcl2012 8.6 Changes
ClojureScript loves React, DomCode May 26 2015
ClojureScript for the web
Clojure 1.1 And Beyond
iSoligorsk #3 2013
The TclQuadcode Compiler
Commit ускоривший python 2.7.11 на 30% и новое в python 3.5
Python and sysadmin I
Ast transformations
The Magnificent Seven
Introduction to clojure
Adventures in TclOO
Naïveté vs. Experience
Ad

Similar to Clojure made simple - Lightning talk (20)

PDF
Clojure made-simple - John Stevenson
ODP
Getting started with Clojure
PDF
Clojure - A new Lisp
KEY
(map Clojure everyday-tasks)
PDF
Clojure Interoperability
PDF
Introduction to Clojure
PDF
Clojure class
PDF
Clojure: Simple By Design
PPT
PDF
From Java To Clojure (English version)
PPTX
Clojure 7-Languages
PDF
Clojure - An Introduction for Lisp Programmers
PDF
Functional web with clojure
PDF
Fun with Functional Programming in Clojure
PDF
Clojure values
PDF
Clojure intro
PDF
Clojure talk at Münster JUG
PDF
Introductory Clojure Presentation
PDF
Clojure - A practical LISP for the JVM
PDF
Clojure
Clojure made-simple - John Stevenson
Getting started with Clojure
Clojure - A new Lisp
(map Clojure everyday-tasks)
Clojure Interoperability
Introduction to Clojure
Clojure class
Clojure: Simple By Design
From Java To Clojure (English version)
Clojure 7-Languages
Clojure - An Introduction for Lisp Programmers
Functional web with clojure
Fun with Functional Programming in Clojure
Clojure values
Clojure intro
Clojure talk at Münster JUG
Introductory Clojure Presentation
Clojure - A practical LISP for the JVM
Clojure
Ad

More from John Stevenson (20)

PDF
ClojureX Conference 2017 - 10 amazing years of Clojure
PDF
Confessions of a developer community builder
PDF
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
PDF
Introduction to Functional Reactive Web with Clojurescript
PDF
Thinking Functionally with Clojure
PDF
Communication improbable
PDF
Getting into public speaking at conferences
PDF
Get into Functional Programming with Clojure
PDF
Guiding people into Clojure
PDF
Git and github - Verson Control for the Modern Developer
PDF
Get Functional Programming with Clojure
PDF
So you want to run a developer event, are you crazy?
PPTX
Trailhead live - Overview of Salesforce App Cloud
PDF
Clojure for Java developers
PPTX
Introducing the Salesforce platform
PPT
Dreamforce14 Metadata Management with Git Version Control
PPT
Salesforce Summer of Hacks London - Introduction
PPTX
Heroku Introduction: Scaling customer facing apps & services
PPT
Developers guide to the Salesforce1 Platform
PPTX
Developer week EMEA - Salesforce1 Mobile App overview
ClojureX Conference 2017 - 10 amazing years of Clojure
Confessions of a developer community builder
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Introduction to Functional Reactive Web with Clojurescript
Thinking Functionally with Clojure
Communication improbable
Getting into public speaking at conferences
Get into Functional Programming with Clojure
Guiding people into Clojure
Git and github - Verson Control for the Modern Developer
Get Functional Programming with Clojure
So you want to run a developer event, are you crazy?
Trailhead live - Overview of Salesforce App Cloud
Clojure for Java developers
Introducing the Salesforce platform
Dreamforce14 Metadata Management with Git Version Control
Salesforce Summer of Hacks London - Introduction
Heroku Introduction: Scaling customer facing apps & services
Developers guide to the Salesforce1 Platform
Developer week EMEA - Salesforce1 Mobile App overview

Recently uploaded (20)

PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
A Presentation on Artificial Intelligence
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
KodekX | Application Modernization Development
PDF
Machine learning based COVID-19 study performance prediction
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Empathic Computing: Creating Shared Understanding
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Approach and Philosophy of On baking technology
PDF
cuic standard and advanced reporting.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
A Presentation on Artificial Intelligence
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Advanced methodologies resolving dimensionality complications for autism neur...
KodekX | Application Modernization Development
Machine learning based COVID-19 study performance prediction
Network Security Unit 5.pdf for BCA BBA.
Empathic Computing: Creating Shared Understanding
Diabetes mellitus diagnosis method based random forest with bat algorithm
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Review of recent advances in non-invasive hemoglobin estimation
Chapter 3 Spatial Domain Image Processing.pdf
Approach and Philosophy of On baking technology
cuic standard and advanced reporting.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...

Clojure made simple - Lightning talk

  • 1. ( s im p le ( c lo ju r e ) ) C lo ju r e m a d e s im p le Ta l k
  • 2. W h a t is C lo ju r e
  • 5. Clojure is small and flexible
  • 6. Clojure concepts Encourages Pure Functional approach - use STM to change state Functions as first class citizens - functions as arguments as they return a value Make JVM interoperation simple - easy to use your existing Java applications
  • 7. A better Lisp ! Sensible () usage Sensible macro names JVM Interoperability
  • 8. Which LISP is your wingman ? Common Lisp Clojure
  • 9. The dark side of Clojure ( x )
  • 10. The dark side of Clojure ( ( x ) )
  • 11. The dark side of Clojure ( ( ( x ) ) )
  • 12. The dark side of Clojure ( ( ( ( x ) ) ) )
  • 13. The dark side of Clojure ( ( ( ( ( x ) ) ) ) )
  • 14. ...verses non-lisp languages ( ) == { ( ) };
  • 15. Well nearly.... ([] ((()))) == { ( {( []) }) };
  • 16. C o m p a r in g J a va w it h C lo ju r e
  • 17. It s a ll b y t e c o d e in t h e e nd .. Any object in clojure is just a regular java object A reference type inheriting from: j ava. l ang. obj ec t
  • 19. B a s ic C lo ju r e S yn ta x
  • 20. Name-spaces ; Define a namespace ( ns nam s pac e- nam e- e) ; Include namespace code ( us e ' nam - s pac e- nam es e) Groups code together like a package statement in Java
  • 21. Defining a function First principles Syntactic Sugar ( def nam e ( def n nam e ( f n [ ar gs ] [ ar gs ] ( f unc t i on- body ( f unc t i on- …) ) ) body . . . ) ) ( def n w c om m s age [ nam ] el e- es e ( pr i nt l n ( s t r “ W c om t o Cl oj ur e ” el e nam )e)
  • 22. Special forms Special evaluation rules for the Clojure compiler - part of the language definition catch, def, do, dot ('.'), finally, fn, if, let, loop, monitor-enter, monitor-exit, new, quote, recur, set!, throw, try and var
  • 23. Simple function example Define a simple function ( def n hel l o- w l d [ nam or e] ( pr i nt l n( s t r " Hel l o " nam ) ) e) Call the function in the REPL or in your code ( hel l o- w l d " j r 0c ket " ) or
  • 24. Prefix notation ( def n s quar e- t he- number [ x] ( * x x) )
  • 25. “Overloading” functions ( def n make ([ ] ; do t h e f o l l o wi n g f u n c t i o n i f n o ar g s ( s t r uc t vec t or 0 0) ) ( [ x y] ; d o i f x an d y ar e ar g u me n t s ( s t r uc t vec t or x y) ) )
  • 26. Im m u t a b le D a ta s truc ture s
  • 27. List – Ordered collection ( l i s t 1 3 5 7) ' ( 1 3 5 7) ( 1 2 3) ; 1 i s n o t a f unct i on
  • 28. Vectors – hashed ordered list [ : m r i x- c har ac t er s [ : neo at : m pheus : t r i ni t y : s m t h] ] or i ( f i r s t [ : n e o : mo r p h e u s : t r i n i t y : s mi t h ] ) ( nt h [ : mat r i x : b ab yl o n 5 : f i r e f l y : s t ar g at e ] 2 ) ( c onc at [ : n e o ] [ : t r i n i t y] )
  • 29. Maps – unordered key/values { : a 1 : b 2} { : a { : a 1} } { : a 1 , : b 2} {: a {: a 1}} { :a 1 :b } { { : a 1} : a} j ava. l an g . Ar r ayI n d e x Ou t Of Bo { { : a 1 } : a} u n d s Ex c e p t i o n : 3 ; i d i om - put : a on t he left { : a 1 : b 2} { : a 1 , : b 2}
  • 30. L is t s a r e f o r c ode Ve c t o r s a r e fo r d a ta
  • 31. Working with data (last [1 1 2 3 5 8]) (doc last) (defn penultimate [x] (last (butlast x)) ) (doc butlast) (penultimate [1 2 3 4 5])
  • 32. And more... (nth [1 1 2 3 5 8] 2) (count [1 1 2 3 5 8]) (reverse [1 1 2 3 5 8]) (defn palindrome? [x] Proposition – naming (= x (reverse x)) ) convention
  • 33. Even more (flatten [[1 1] 2 [3 [5 8]]]) (compress "aaaabccaadeeee") (encode "aaaabccaadeeee") (replicate 10 "a")
  • 34. Defining a data structure ( def m dat a- s t r uc t ur e y- [ dat a ] ) ( def days - of - t he- week [ “Monday” “ Tues day” “W ednes day” ] )
  • 35. Example data structure ( def j r 0c ket { : f i r s t - nam " J ohn" , e : l as t - name " St evens on" } )
  • 36. G e t c o d in g !
  • 37. c lo ju r e . org d o c s . c lo ju r e .o rg
  • 38. All hail the REPL An interactive shell for clojure Fast feedback loop for clojure
  • 41. M a n a g in g a c lo ju r e p r o je c t
  • 42. Maven Just like any other Java project Step 1) Add Clojure library jar to your POM Step 2) Download the Internet !!!
  • 43. le in in g e n Leiningen .o rg lein new Create a new clojure project lein deps Download all dependencies lein repl Start the interactive shell (repl) lein swank Start repl server
  • 48. A fe w in t e r e s t in g C lo ju r e e x a m p le s
  • 49. str (str h e l l o) Concatenate strings together represent a character using (def data “boo”) Join arguments with (str “message” data ) strings
  • 50. Ratio Unique data type ( / 3 5) ( / 3. 0 Allow lazy evaluation 5) Avoid loss of precision (/ 1 3) (/ 1.0 3) (class (/ 1
  • 51. Calling Java... ooooo!! ( j avax . s wi n g . JOp t i o n Pan e / s h o wMe s s ag e D i al o g n i l " He l l o W r l d " ) o
  • 52. Importing Java into Clojure ( ns dr aw ng- dem i o ( : i m t [ j avax. s w ng J panel por i J Fr am e] [ j ava. awt Di m i on] ) ) ens
  • 53. Working with Java Java Classes fullstop after class name ( J Fr am ) e. (Math/cos 3) ; static method call Java methods fullstop before method name ( . get Cont ent Pane f r am ;;method name first e) ( . f r am get Cont ent Pane) ;;object first e
  • 54. What class is that... (class (str "Jr0cket")) java.lang.String (class (defn hello-world [name] (str "Hello cruel world"))) clojure.lang.Var
  • 55. Clojure calling Java web stuff ( l et [ c onn] ( dot o ( Ht t pUr l Connec t i on. Ur l ) ( . s et Reques t M hod et “ POST” ) ( . s et DoOut put t r ue) ( . s et I ns t aneFol l ow Redi r ec t s t r ue) ) ] )
  • 56. Recursive functions Functions that call Tail recursion themselves Avoids blowing the stack Fractal coding A trick as the JVM does not support tail recursion directly :-(
  • 57. Tail recursion ( def n r ec ur s i ve- c ount er ( pr i nt ans w )er ( i f ( < ans w er 1000) ( r ec ur ( + ans wer 4) ) ) )
  • 58. Where to find out more... c l oj ur e. or g/ c heat s h eet
  • 59. M u t a b le S t a t e
  • 60. Software Transactional Memory Provides safe, concurrent access to memory Agents allow encapsulated access to mutable resources
  • 61. Functional for the web Big blog of stuff in > Big blob of stuff out Encourages modularising responsibilities Good at processing data in parallel
  • 62. Noir w e b n o ir . o r g
  • 63. M o re to c o m e ... c l oj ur e. or g dev. c l oj ur e. or g @ r 0c ket j c l oj ur e. j r 0c ket . c o

Editor's Notes

  • #7: Hickey&apos;s primary interest was concurrency — he wanted the ability to write multi-threaded applications, but increasingly found the mutable, stateful paradigm of object oriented programming to be part of the problem The idea of a functional Lisp integrated with a commercially accepted host platform just seemed like chocolate and peanut butter. Coming up with persistent data structures that were fast enough was the tipping point for my considering it viable. functions as first-class objects, meaning that functions can be placed into data structures, passed as arguments to other functions, evaluated in comparisons, even returned as the return value of another function. Moreover, functions do not have &amp;quot;side effects&amp;quot; — the ability to modify program state or data. This paradigm focuses on computation in the mathematical sense, rather than procedural algorithms, and is a completely different approach to programming. Clojure does provide persistent data structures For application developers, the most significant distinction is that Clojure defaults to making all data structures immutable developers must use one of four special mutable structures that are explicitly designed to be shared between threads: refs, vars, atoms, and agents. Clojure uses software transactional memory (STM) to coordinate changing these mutable structures while keeping them in a consistent state, much like a transactional database. This model makes it considerably simpler to write thread-safe code than it is in object oriented languages. No locks are required, therefore there are no deadlocks or race conditions.
  • #8: Clojure has a programmatic macro system which allows the compiler to be extended by user code You can add your own language features with macros. Clojure itself is built out of macros such as defstruct: (defstruct person :first-name :last-name) If you need different semantics, write your own macro. If you want a variant of structs with strong typing and configurable null-checking for all fields, you can create your own defrecord macro, to be used like this: (defrecord person [String :first-name String :last-name] :allow-nulls false) This ability to reprogram the language from within the language is the unique advantage of Lisp. You will see facets of this idea described in various ways: Lisp is homoiconic - Lisp code is just Lisp data. This makes it easy for programs to write other programs. The whole language is there, all the time. Paul Graham’s essay “Revenge of the Nerds” explains why this is so powerful. http://www.paulgraham.com/icad.html Lisp syntax also eliminates rules for operator precedence and associativity, with fully parenthesized expressions, there is no possible ambiguity
  • #10: The downside of Lisp’s simple, regular syntax, at least for beginners, is Lisp’s fixation on parentheses and on lists as the core data type. Clojure offers an interesting combination of features that makes Lisp more approachable for non-Lispers.
  • #11: The downside of Lisp’s simple, regular syntax, at least for beginners, is Lisp’s fixation on parentheses and on lists as the core data type. Clojure offers an interesting combination of features that makes Lisp more approachable for non-Lispers.
  • #12: The downside of Lisp’s simple, regular syntax, at least for beginners, is Lisp’s fixation on parentheses and on lists as the core data type. Clojure offers an interesting combination of features that makes Lisp more approachable for non-Lispers.
  • #13: The downside of Lisp’s simple, regular syntax, at least for beginners, is Lisp’s fixation on parentheses and on lists as the core data type. Clojure offers an interesting combination of features that makes Lisp more approachable for non-Lispers.
  • #14: The downside of Lisp’s simple, regular syntax, at least for beginners, is Lisp’s fixation on parentheses and on lists as the core data type. Clojure offers an interesting combination of features that makes Lisp more approachable for non-Lispers.
  • #21: When you require a library named clojure.contrib.str-utils, Clojure looks for a file named clojure/contrib/str-utils.clj on the CLASSPATH To avoid having to use the namespace for your library, you have to use refer, like so - (refer &apos;examples/introduction) The use function does both require refer, like so – (use &apos;examples.introduction) o force a library to reload: (use :reload-all &apos;examples.introduction) The :reload-all flag is useful if you are making changes and want to see results without restarting the REPL.
  • #22: (defn …) is syntactic sugar for (def name (function [] … ) Most people use the defn shortcut as its much more readable.
  • #58: This is barfing because the evaluator has to keep around state for each call due to the expression (* x (factorial (- x 1))) . We need to make this function tail recursive. recur can be thought of as the Clojure operator for looping. Think of it like a function call for the nearest enclosing let or function definition supplied with new variables. Naively we can switch over to using this by doing: user&gt; (defn factorial2 [x] (if (= x 0) 1 (* x (recur (- x 1))))) But this is a compile-time error (which in itself is pretty neat!). java.lang.UnsupportedOperationException: Can only recur from tail position (NO_SOURCE_FILE:4) An accumulator parameter is an extra parameter to a function that&apos;s used to gather intermediate parts of the calculation. If we do this, we can make sure that the recur call is in the tail position. Using an anonymous function we get: (defn factorial3 [x] ((fn [x y] (if (= x 0) y (recur (- x 1) (* x y)))) x 1)) Now when recur is used, it doesn&apos;t need to keep any of the previous stack frame around. This means we can finally calculate factorial 1000000, which begins with 282 and ends with lots of zeros!
  • #63: Hiccup library for representing HTML in Clojure. It uses vectors to represent tags, and maps to represent a tag&apos;s attributes.