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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
670
Data-Centric Kaggle
isax1015
2
770
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
700
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
180
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
160
Patterns of Patterns
denyspoltorak
0
1.4k
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
140
高速開発のためのコード整理術
sutetotanuki
1
390
Architectural Extensions
denyspoltorak
0
280
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
600
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
Featured
See All Featured
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
210
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Docker and Python
trallard
47
3.7k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
730
Odyssey Design
rkendrick25
PRO
1
490
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
930
Automating Front-end Workflow
addyosmani
1371
200k
[SF Ruby Conf 2025] Rails X
palkan
1
740
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
64
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
51
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
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