Clojure night
-
Upload
aria-haghighi -
Category
Technology
-
view
196 -
download
0
Transcript of Clojure night
Clojure Community Night
Aria Haghighi CTO
@aria42Saturday, 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
EncapsulateThe
Object
Saturday, October 5, 13
Programming to Behavior
Interface
EncapsulateThe
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
mapsdefn
destructuring
macrosSaturday, October 5, 13
Data Behavior
sequences
mapsdefn
destructuring
macros
deftype
protocol
reify
Saturday, October 5, 13
Data Behavior
sequences
mapsdefn
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 Graphdata-oriented
composition and dependency
prismatic/plumbing
Saturday, October 5, 13
Graph: Overview
Saturday, October 5, 13
Graph: OverviewUnivariate statistics: Given data as double[] xs
Saturday, October 5, 13
Graph: OverviewUnivariate statistics: Given data as double[] xs
m =1
n
nX
i=1
xi
m2 =1
n
nX
i=1
x
2i
v = m2 �m2
Saturday, October 5, 13
Graph: OverviewUnivariate statistics: Given data as double[] xs
m =1
n
nX
i=1
xi
m2 =1
n
nX
i=1
x
2i
v = m2 �m2
xs
n
m2 m
v
Saturday, October 5, 13
Graph: OverviewUnivariate statistics: Given data as double[] xs
xs
n
m2 m
v
Saturday, October 5, 13
Graph: OverviewUnivariate statistics: Given data as double[] xs
xs
n
m2 m
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
m2 m
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
m2 m
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)))}
kkkk
xs
n
m2 m
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
argmax
`w · x`
prediction
Saturday, October 5, 13
HipHip Examples Dot Product w · x =
nX
i=1
wixi
Inner loop in machine learning
argmax
`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
ThanksQuestions?
Saturday, October 5, 13