Clojure night

Post on 26-May-2015

196 views 0 download

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