Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to Clojure
Search
Deon Moolman
October 22, 2013
Programming
1
580
Introduction to Clojure
A short introduction to Clojure, the principles, syntax and some function
Deon Moolman
October 22, 2013
Tweet
Share
Other Decks in Programming
See All in Programming
How Android Uses Data Structures Behind The Scenes
l2hyunwoo
0
480
Updates on MLS on Ruby (and maybe more)
sylph01
1
180
チームのテスト力を鍛える
goyoki
3
900
Putting The Genie in the Bottle - A Crash Course on running LLMs on Android
iurysza
0
140
🔨 小さなビルドシステムを作る
momeemt
4
690
AI時代のUIはどこへ行く?
yusukebe
18
9.1k
rage against annotate_predecessor
junk0612
0
170
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
290
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
610
ProxyによるWindow間RPC機構の構築
syumai
3
1.2k
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
400
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
120
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
530
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
How to Ace a Technical Interview
jacobian
279
23k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Designing for Performance
lara
610
69k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.1k
Embracing the Ebb and Flow
colly
87
4.8k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Transcript
Deon Moolman @CmdrDats Introduction to Clojure bit.ly/cljintro
Download Light Table http://www.lighttable.com/ bit.ly/cljintro
“Programming is not about typing. It’s about thinking” - Rich
Hickey bit.ly/cljintro
The Clojure Philosophy - Michael Fogus Simplicity Empowerment Focus What
is Clojure? bit.ly/cljintro
Functional What is Clojure? bit.ly/cljintro
Functional Concurrent What is Clojure? bit.ly/cljintro
Functional Concurrent Dynamic What is Clojure? bit.ly/cljintro
Functional Concurrent Dynamic Lisp What is Clojure? bit.ly/cljintro
Lisp Functional Concurrent Dynamic running on the JVM What is
Clojure? bit.ly/cljintro
“By relieving the brain of all unnecessary work, a good
notation sets it free to concentrate on more advanced problems.” - Alfred North Whitehead Collections Basic Syntax? bit.ly/cljintro
\c “string” 123 123.0 1/3 fred :name #”[0-9]+” nil true
Collections Basic Syntax? bit.ly/cljintro
(fred bob mary) [1 2 bob] {:name “bob”, “age” 12}
#{1 3 5 “mary” joe} Collections Basic Syntax? bit.ly/cljintro
Evaluation Reader Evaluator JVM Effect Source REPL bit.ly/cljintro
Switching Gears (order :spatula 200) (+ 100 (* 5 2)
5) - Some random Clojure code Basic Concepts bit.ly/cljintro
(def myvar 123) (def myname “Deon”) (def person {:name “Bob”
:age 12}) Basic Concepts bit.ly/cljintro Vars
(fn [x] (+ x 10)) (def inc-ten ) #(+ %
10) Basic Concepts bit.ly/cljintro Function definitions
(def inc-ten ) (fn [x] (+ x 10)) (defn inc-ten
[x] (+ x 10)) #(+ % 10) Basic Concepts bit.ly/cljintro Function definitions
(ns intro.gears (:use [clojure.tools.logging]) (:require [intro.defs :as defs]) (:import [java.util.concurrent
LinkedBlockingQueue])) (info “Hello world”) (defs/inc-ten 3) (LinkedBlockingQueue.) Basic Concepts bit.ly/cljintro Namespaces
(def q (LinkedBlockingQueue.)) (.add q "test") (.peek q) (java.util.Calendar/getInstance) Calendar/MAY
(proxy [Runnable] (run [] (println “Hello World”))) Basic Concepts bit.ly/cljintro Java interop
(defn add-vector [pos vector] [(+ (first pos) (first vector)) (+
(second pos) (second vector))]) (defn add-vector [[x y] [vx vy]] [(+ x vx) (+ y vy)]) (add-vector [1 2] [5 6]) => [6 7] Basic Concepts bit.ly/cljintro Destructuring
(defn id-name-pair [person] [(:id person) (:name person)]) (defn id-name-pair [{name
:name id :id}] [id name]) (defn id-name-pair [{:keys [name id]}] [id name]) Basic Concepts bit.ly/cljintro Destructuring
“The four building blocks of the universe are fire, water,
gravel and vinyl.” - Dave Barry Groundwork Functions bit.ly/cljintro
Core Groundwork Functions bit.ly/cljintro
if (if x 1 2) (if (account-empty? account) (send-alert) (move-money))
Groundwork Functions bit.ly/cljintro
if let (let [x 1, y 2] (+ x (*
64 y))) (let [person (find-person id) account (find-account person)] (:balance account)) Groundwork Functions bit.ly/cljintro
cond (cond (nil? name) “No name” (nil? age) “No age”
:else “All fine”) if let Groundwork Functions bit.ly/cljintro
loop recur (loop [x 1] (if (> x 5) x
(recur (inc x))) if let cond (defn sum [x xs acc] (cond (nil? x) acc :else (recur (first xs) (rest xs) (+ acc x))) Groundwork Functions bit.ly/cljintro
and or (and 1 5) => 5 (or 1 false)
=> 1 (and (old-enough? person) (qualifies? person)) (or (old-enough? person) (qualifies? person)) if let loop recur cond Groundwork Functions bit.ly/cljintro
apply (defn sum3 [x y z] (+ x y z))
(let [x [2 3 4]] (sum3 (nth x 0) (nth x 1) (nth x 2)) (let [x [2 3 4]] (apply sum3 x)) if let loop recur and or cond Groundwork Functions bit.ly/cljintro
complement (defn too-big? [x] (> x 50)) (defn small-enough? [x]
(not (too-big? x))) if let loop recur and or cond apply (defn complement [f] (fn [x] ...)) Groundwork Functions bit.ly/cljintro
complement (defn too-big? [x] (> x 50)) (defn small-enough? [x]
(not (too-big? x))) (def small-enough? (complement too-big?)) if let loop recur and or cond apply (defn complement [f] (fn [x] (not (f x)))) Groundwork Functions bit.ly/cljintro
if let loop recur and or cond apply complement juxt
(defn id-name-pair [person] [(:id person) (:name person)]) (def id-name-pair (juxt :id :name)) (map (juxt :width :length :height) items) (defn juxt [& fs] (fn [x] ...)) Groundwork Functions bit.ly/cljintro
if let loop recur and or cond apply complement juxt
(defn id-name-pair [person] [(:id person) (:name person)]) (def id-name-pair (juxt :id :name)) (map (juxt :width :length :height) items) (defn juxt [& fs] (fn [x] (vec (map ... fs)))) Groundwork Functions bit.ly/cljintro
if let loop recur and or cond apply complement juxt
(defn id-name-pair [person] [(:id person) (:name person)]) (def id-name-pair (juxt :id :name)) (map (juxt :width :length :height) items) (defn juxt [& fs] (fn [x] (vec (map #(% x) fs)))) Groundwork Functions bit.ly/cljintro
if let loop recur and or cond apply complement juxt
partial memoize fnil identity Groundwork Functions Core bit.ly/cljintro
Collection Groundwork Functions bit.ly/cljintro
conj (conj [1 2 3] 4) => [1 2 3
4] (conj ’(1 2 3) 4) => ’(4 1 2 3) (conj #{1 2 3} 4) => #{1 2 3 4} Groundwork Functions bit.ly/cljintro
conj assoc (assoc {:name “Deon”} :age 21) => {:name “Deon”
:age 21} Groundwork Functions bit.ly/cljintro
conj assoc sort-by (sort-by :age [{:id 1 :age 21} {:id
2 :age 18}]) => ’({:age 18, :id 2} {:age 21, :id 1}) Groundwork Functions bit.ly/cljintro
conj assoc sort-by map (def xs [{:id 1 :age 21}
{:id 2 :age 18}]) (map :id xs) => ’(1 2) (map #(+ 10 (:id %)) xs) => ’(11 12) Groundwork Functions bit.ly/cljintro
conj assoc sort-by map reduce (reduce + [1 2 3
4 5]) => 15 (defn condsum [acc x] (if (odd? x) (+ acc x) acc) (reduce condsum 0 [1 2 3 4 5]) => 9 Groundwork Functions bit.ly/cljintro
conj assoc sort-by map reduce filter (filter odd? [1 2
3 4 5]) => ’(1 3 5) (filter #(> 3 %) [1 2 3 4 5]) => ’(4 5) Groundwork Functions bit.ly/cljintro
conj assoc sort-by map reduce filter for (for [x (range
3) y (range 3 6)] (+ x y)) => ’(3 4 5 4 5 6 5 6 7) Groundwork Functions bit.ly/cljintro
conj assoc sort-by map reduce filter for take lazy-seq partition
concat Groundwork Functions Collection bit.ly/cljintro
Concurrency Groundwork Functions bit.ly/cljintro
atom (let [a (atom 1) x @a] (swap! a +
2) (not= @a x)) Groundwork Functions bit.ly/cljintro
atom ref (let [r1 (ref 0), r2 (ref 100)] (dosync
(alter r1 + 12) (alter r2 - 12))) Groundwork Functions bit.ly/cljintro
atom ref agent (def ant (agent 100)) (defn damage [health
damage] (- health damage)) (send ant damage 10) (= @ant 90) Groundwork Functions bit.ly/cljintro
atom ref agent future promise deliver await Groundwork Functions Concurrency
bit.ly/cljintro
Bootstrapping Time emacs Light Table CounterClockWise VimClojure Cursive Sublime Text
bit.ly/cljintro Editor Options
Install Leiningen: http://leiningen.org/ Bootstrapping Time Install Light Table: http://www.lighttable.com/ bit.ly/cljintro
Install
Create a new project: > lein new sugsa-prj Bootstrapping Time
Add folder to workspace in LightTable Open core.clj, evaluate foo with ⌘㾑 Open Light Table console bit.ly/cljintro
Bootstrapping Time add (defn -main [& args] (foo 1)) add
:main sugsa-prj.core to project.clj add (:gen-class) to (ns sugsa-prj.core) > lein run bit.ly/cljintro Real Project
Bootstrapping Time Add maven [groupid/artifactid “1.2.3”] to :dependencies vector Open
project.clj bit.ly/cljintro Add Dependencies
Bootstrapping Time Web Dev: ring, compojure, enlive, hiccup Database: java.jdbc,
monger http://www.clojure-toolbox.com/ https://clojars.org/ bit.ly/cljintro Libraries
Bootstrapping Time http://www.4clojure.com/ http://clojurekoans.com/ http://tryclj.com/ bit.ly/cljintro Learning #clojure on irc.freenode.net
Reference Material Bootstrapping Time Books: Programming Clojure, Joy of Clojure
Cheatsheet: http://clojure.org/cheatsheet Videos: http://www.infoq.com/clojure/ bit.ly/cljintro
Thank you. #clojure.za on irc.freenode.net @CmdrDats @clj_ug_ct bit.ly/cljintro