Clojure Small Intro

Post on 28-Nov-2014

1.760 views 1 download

description

Presentation for JHUG in Greece

Transcript of Clojure Small Intro

Clojure

John Vlachoyiannis@jonromero

jon@emotionull.comHttp://jon.is.emotionull.com

What is Clojure?

Ok, what is Lisp?

“Lisp is worth learning for the profound enlightenment experience you will have

when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use

Lisp itself a lot."

Eric S. Raymond, "How to Become a Eric S. Raymond, "How to Become a Hacker".Hacker".

“LISP stands for: Lots of Insane Stupid Parentheses”

AnonymousAnonymous

The Truth about Lisp

LISLISt PProcessing

● Second oldest high-level language (first is Fortran)

● Code as Data (Homoiconic)● Perfect for Domain-specific languages

(DSL)● Exploratory programming

Clojure

● Lisp in JVM● Concurrent programming● Dynamic Development (REPL)● Lazy sequences● No side effects (almost)

Enter Clojure

Everything is code

(println "Hello World")

function argument

Everything is data

(println "Hello World")

symbol string

list

● Integers – 1234567891234● Doubles – 3.14. BigDecimals – 3.14M● Ratios – 22/4● Strings – '”foo”, Character – \a \b \c● Symbols – foo, Keywords :foo● Booleans – true false, Null – nil● Regex patterns – #”[a-zA-Z0-9]|

Data structures

● Lists● (1 2 3 4), (foo bar baz), (list 1 2 3)

● Vectors● [1 2 3], [foo bar], (vector 1 2 3)

● Maps● {:a 1 :b 2 :c 3}

● Sets ● #{foo bar}

“It is better to have 100functions operate on one data

structure than to have 10functions operate on 10 data

Structures.”

Alan J. PerlisAlan J. Perlis

clojure might be a better java than java

public class StringUtils {public static boolean isBlank(String str) {

int strLen;if (str == null || (strLen = str.length()) == 0) {

return true;}for (int i = 0; i < strLen; i++) {

if ((Character.isWhitespace(str.charAt(i)) == false)) {

return false;}

}return true;

}}

public class StringUtils {public isBlank(str) {

if (str == null || (strLen = str.length()) == 0) {return true;

}for (i = 0; i < strLen; i++) {

if ((Character.isWhitespace(str.charAt(i)) == false)) {

return false;}

}return true;

}}

public isBlank(str) {if (str == null || (strLen = str.length()) == 0) {

return true;}for (i = 0; i < strLen; i++) {

if ((Character.isWhitespace(str.charAt(i)) == false)) {return false;

}}return true;

}

public isBlank(str) {if (str == null || (strLen = str.length()) == 0) {

return true;}

every (ch in str) {Character.isWhitespace(ch);

} return true;

}

public isBlank(str) {every (ch in str) {

Character.isWhitespace(ch);}

}

(defn blank? [s] (every? #(Character/isWhitespace %) s))

Clojure vs Java code

● Side-effect free ● Easy to (unit) test● Lazy collection● Any element● Slower● Data manipulation● Exploratory

● Error prone● Not so easy● Only one element● Only with chars● Faster● If/for/while code ● Design Is Law

Clojure is a functional language

● Functions are first-class objects● Data is immutable● Functions are pure

So what?

● Simple: no loops, variables or mutable state

● Thread-safe: no locking● Parallelizable: map/reduce anyone?● Generic: data is always data● Easy to test: same input, same output

user=> (println "hello world")| hello world-> nil

user=> (defn hello [name] (str "Hello, " name))

#'user/hello

(hello "Clojure")

(.toUpperCase “hello”)

(str “hello” “ “ “world”)

(+ 1 3 4 (* 5 6))

(defn greeting"Returns a greeting of the form 'Hello, username.'"[username](str "Hello, " username))

(greeting "world")

user=> (doc greeting)-------------------------exploring/greeting

([username])Returns a greeting of the form 'Hello, username.'

(defn is-small? [number](if (< number 100)

"yes" ))

(is-small? 50)"yes"

(is-small? 50000)nil

(defn is-small? [number](if (< number 100)

"yes" "no" ))

Solving problems

● Experiment with the problem ● Create your data structures ● Data transformations● Write code that writes code for you

(macros)● Create a mini language (a DSL)

Java in Clojure

● Yeap

Clojure in Java

● Yeap

Clojure in Clojure

● Yeap, yeap

Java in Clojure

java new Widget(“foo”)

clojure (Widget. “foo”)

java dialog.show()

clojure (.show dialog)

Tools

● Emacs + SLIME● ViMClojure ● Enclojure + Intellij IDEA● Counterclockwise + Eclipse● Leiningen

Clojure is not a just a new language

Is another, simplier way to solve problems

Thanks! Questions?@jonromero