Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ •...

36
Thinking in ClojureScript Programming is not about typing, it's about thinking 4 Rich Hickey

Transcript of Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ •...

Page 1: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Thinking'in'ClojureScriptProgramming)is)not)about)typing,)it's)about)thinking)4)Rich)Hickey

Page 2: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

What%is%ClojureScript?

ClojureScript-is-a-compiler-for-Clojure-that-targets-JavaScript.

Page 3: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Goals• Understand*the*ClojureScript*thought*process

• Learn*enough*ClojureScript

• Convince*YOU*to*take*ClojureScript*for*a*spin

• Take*some*of*these*principles*back*to*JavaScript

Page 4: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Why$ClojureScript?• Philosophy

• It's-not-JavaScript

• Data-Structures-/-Immutability

• core.async-library

Page 5: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

It's%not%JavaScript

Page 6: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …
Page 7: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

• Thought(out(design((Nan == Nan ;false)

• Ba2le(tested((i.e.(Google(Closure)

• Browser(Repl

• Real;me(feedback(

• Macros,(namespaces

Page 8: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Figwheel(/(Browser(Repl

Page 9: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Just%enough%ClojureScript

Page 10: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Hello%ClojureScript

Hello ClojureScript;; Hello ClojureScript

Page 11: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Func%on'Call

(+ 5 (* 5 2));; 15

// JavaScript5 + 5 * 2

Page 12: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Defining'Func+ons

(defn multiply [x, y] (* x y))

// JavaScriptfunction multiply(x, y) { x * y}

Page 13: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Interop

(. js/document (getElementById "app");; method call(.-value input) ;; property

Page 14: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

atom

(def count (atom 0))

@count;; 0

(swap! count 1)(reset! count 1)

Page 15: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

let

(let [x 1] x)

Page 16: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Macros

(-> (om/get-node owner "new-contact-name") .-value)

Page 17: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

(defmacro unless [pred & body] `(if (not ~pred) (do ~@body) nil))

;; Compiles to(macroexpand '(unless true (/ 1 0)); => (if (clojure.core/not true) (do (/ 1 0)) nil)

Page 18: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

core.asyc

Clojure's*implementa1on*of*Communica1ng*Sequen1al*Processes

Page 19: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Communica)ng+Sequen)al+Processes• processes

• channels

• coordina.on

Page 20: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Escape'callback'hell

Page 21: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Write&sequen+al&logic

(println "do something") (send-to-channel) (println "continue")

Page 22: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Primi%ves

Page 23: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Chan%(get%be+er%defini0ons%for%these)

(chan)

Page 24: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Put

(put!)(>!)

Page 25: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Take

(take!)(<!)

Page 26: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

go

(go (println "Waiting...") (<! events) (show! "Got an event"))

Page 27: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Code%example

Page 28: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Immutability

(def a [1 2 3])(println (conj a 42));; [1 2 3 42](println a);; [1 2 3]

Page 29: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Om#+#React

Page 30: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Lets%talk%about%Om

Page 31: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Om

Interface)to)Facebook's)React

Page 32: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

React• V#in#MVC

• Immediate#mode#rendering

• Components

Page 33: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …
Page 34: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Example

h"ps://github.com/iamjarvo/pplz

Page 35: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Helpful'links• h#p://funcool.github.io/clojurescript6unraveled/

• h#ps://github.com/circleci/frontend

• h#ps://www.youtube.com/user/ClojureTV

• h#ps://github.com/omcljs/om

• h#p://swannode#e.github.io/

Page 36: Thinking'in'ClojureScript...Helpful'links • h#p://funcool.github.io/clojurescript6unraveled/ • h#ps://github.com/circleci/frontend • h#ps:// • …

Me• Jearvon)Dharrie

• Twi/er:)@jearvon

• Podcast:)h/p://turing.cool