Clojure
Community
Night
Aria Haghighi
CTO
@aria42
Saturday, October 5, 13
Eng @ Prismatic
Saturday, October 5, 13
Eng @ Prismatic
All Clojure in the
back
Saturday, October 5, 13
Eng @ Prismatic
All Clojure in the
back
Some Clojure in
the front
Saturday, October 5, 13
Saturday, October 5, 13
<31. Why
Saturday, October 5, 13
<31. Why
2.
Open
Source
Saturday, October 5, 13
<31. Why
2.
Open
Source
3.
What’s
needed
Saturday, October 5, 13
Why Clojure
<3
Saturday, October 5, 13
Programming to Behavior
Saturday, October 5, 13
Programming to Behavior
Saturday, October 5, 13
Programming to Behavior
Encapsulate
The
Object
Saturday, October 5, 13
Programming to Behavior
Interface
Encapsulate
The
Object
Saturday, October 5, 13
Programming to Behavior
At it’s best,
OOP is about
coding to
behavior, not
state or identity
Saturday, October 5, 13
Programming to Data
Saturday, October 5, 13
Programming to Data
Inherent data
structures can
be used to
derive the
structure of a
program
Saturday, October 5, 13
Programming to Data
Inherent data
structures can
be used to
derive the
structure of a
program
Saturday, October 5, 13
Programming to Data
Saturday, October 5, 13
Programming to Data
Ins & Outs
Saturday, October 5, 13
Programming to Data
Ins & Outs
Represent
Saturday, October 5, 13
Programming to Data
Ins & Outs
Represent
Transform
Saturday, October 5, 13
The killer feature
of Clojure isn’t that
it’s a functional
language, but the
best data-oriented
one
Programming to Data
Saturday, October 5, 13
Data Behavior
Saturday, October 5, 13
Data Behavior
sequences
maps
defn
destructuring
macros
Saturday, October 5, 13
Data Behavior
sequences
maps
defn
destructuring
macros
deftype
protocol
reify
Saturday, October 5, 13
Data Behavior
sequences
maps
defn
destructuring
macros
records
multi-
methods
deftype
protocol
reify
Saturday, October 5, 13
Data Behavior+
The crown of
Clojure’s design is
the clean
separation of data
and behavior
Saturday, October 5, 13
Open Source
Saturday, October 5, 13
Open Source
Saturday, October 5, 13
Plumbing and Graph
data-oriented
composition and
dependency
prismatic/plumbing
Saturday, October 5, 13
Graph: Overview
Saturday, October 5, 13
Graph: Overview
Univariate statistics: Given
data as double[] xs
Saturday, October 5, 13
Graph: Overview
Univariate statistics: Given
data as double[] xs
m =
1
n
nX
i=1
xi
m2 =
1
n
nX
i=1
x2
i
v = m2 m2
Saturday, October 5, 13
Graph: Overview
Univariate statistics: Given
data as double[] xs
m =
1
n
nX
i=1
xi
m2 =
1
n
nX
i=1
x2
i
v = m2 m2
xs
n
m2m
v
Saturday, October 5, 13
Graph: Overview
Univariate statistics: Given
data as double[] xs
xs
n
m2m
v
Saturday, October 5, 13
Graph: Overview
Univariate statistics: Given
data as double[] xs
xs
n
m2m
v
(defn stats [{:keys [xs]}]
(let [n (count xs)
m (/ (sum xs) n)
m2 (/ (sum sq xs) n)
v (- m2 (* m m))]
{:n n :m m :m2 m2 :v v}))
Saturday, October 5, 13
The Monster let
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
The Monster let
dozens of
parameters,
not compositional
structure of
(de)composition
is locked up in an
opaque function
(defn start [{:keys [a,z]}]
(let [s1 (store a ...)
s2 (store b ...)
db (sql-db c)
t2 (cron s2 db...)
...
srv (server ...)]
(fn shutdown []
(.stop srv)
...
(.flush s1))))
Saturday, October 5, 13
From let to Graph
(defn stats [{:keys [xs]}]
(let [n (count xs)
m (/ (sum xs) n)
m2 (/ (sum sq xs) n)
v (- m2 (* m m))]
{:n n :m m :m2 m2 :v v}))
Saturday, October 5, 13
From let to Graph
(defn stats [{:keys [xs]}]
(let [n (count xs)
m (/ (sum xs) n)
m2 (/ (sum sq xs) n)
v (- m2 (* m m))]
{:n n :m m :m2 m2 :v v}))
xs
n
m2m
v
Saturday, October 5, 13
From let to Graph
(defn stats [{:keys [xs]}]
(let [n (count xs)
m (/ (sum xs) n)
m2 (/ (sum sq xs) n)
v (- m2 (* m m))]
{:n n :m m :m2 m2 :v v}))
{:n (fn [xs] (count xs))
:m (fn [xs n] (/ (sum xs) n))
:m2 (fn [xs n] (/ (sum sq xs) n))
:v (fn [m m2] (- m2 (* m m)))}
xs
n
m2m
v
Saturday, October 5, 13
From let to Graph
(defn stats [{:keys [xs]}]
(let [n (count xs)
m (/ (sum xs) n)
m2 (/ (sum sq xs) n)
v (- m2 (* m m))]
{:n n :m m :m2 m2 :v v}))
{:n (fn [xs] (count xs))
:m (fn [xs n] (/ (sum xs) n))
:m2 (fn [xs n] (/ (sum sq xs) n))
:v (fn [m m2] (- m2 (* m m)))}
k
k
k
k
xs
n
m2m
v
Saturday, October 5, 13
Example:API Service
Saturday, October 5, 13
Example:API Service
(def api-service
(service
{:service-name “api”
:backend-port 42424
:server-threads 100}
{:store1 (instance store
{:type :s3 ...})
:memo (fnk [store1]
{:resource ...})
...
:api-server (...)}))
Saturday, October 5, 13
sane DOM
templating and
manipulation
prismatic/dommy
Dommy
Saturday, October 5, 13
fast primitive
array math
prismatic/hiphip
HipHip (Array)
w · x =
nX
i=1
wixi
Saturday, October 5, 13
HipHip Examples
Saturday, October 5, 13
HipHip Examples
Dot Product w · x =
nX
i=1
wixi
Saturday, October 5, 13
HipHip Examples
Dot Product w · x =
nX
i=1
wixi
Inner loop in
machine learning
Saturday, October 5, 13
HipHip Examples
Dot Product w · x =
nX
i=1
wixi
Inner loop in
machine learning
arg max
`
w · x`
prediction
Saturday, October 5, 13
HipHip Examples
Dot Product w · x =
nX
i=1
wixi
Inner loop in
machine learning
arg max
`
w · x`
prediction
P(x; w) / exp{w · x}
training
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
HipHip Examples
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
(defn dot-product [^doubles ws ^doubles xs]
(areduce ws idx sum 0.0
(+ sum (*  (aget ws idx)
(aget xs idx))))
HipHip Examples
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
HipHip Examples
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
double dotProd(double[] ws, double[] xs) {
double sum = 0.0;
for (int i=0; i < xs.length; ++i) {
sum += ws[i] * xs[i];
}
return sum;
}
HipHip Examples
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
HipHip Examples
Saturday, October 5, 13
Dot Product w · x =
nX
i=1
wixi
(defn dot-product [ws xs]
(hiphip.double/asum [w ws x xs] (* w x)))     
	
HipHip Examples
Saturday, October 5, 13
declarative data
description and
validation
prismatic/schema
Schema
Saturday, October 5, 13
What Clojure needs
Saturday, October 5, 13
Where’s my debugger!?!
Saturday, October 5, 13
MOAR Compiler Speed
(require 'api.deploy)
go get a coffee, it’s
going to be a bit
Saturday, October 5, 13
Compiler Tooling
real IDE tools
Make Paredit a library
Saturday, October 5, 13
Multi-project support
in Leiningen
Saturday, October 5, 13
Native Client Story
Saturday, October 5, 13
Thanks
Questions?
Saturday, October 5, 13

Clojure night