In this next part, I will go over basic Clojure syntax and operations. We will learn all the basics we need to be productive.
Expressions
Clojure has two kinds of structures. Literals and operations.
Literals are your everyday data structures like numbers, strings, vectors, etc...
1
"awesome string"
["vector" "of" "awesome" "strings"]
Operations are your everyday bread and water. It's how you do everything in Clojure.
Operations take form of:
(operator operand1 operand2 operand3 ... operandN)
The important note here is that Clojure uses whitespace to separate operands.
Example operations:
(+ 40 2)
;=> 42
(- 50 8)
;=> 42
(str "Contact" " these " "strings")
;=> "Contact these strings"
Flow
Clojure has some basic control flow operators, that will make our life easier. Let's go over the most basic ones.
if
With if
you can do conditions in your code.
Structure of if expression:
(if boolean
then
else)
So the basic example here would be something like this:
(if true
"Clojure seems awesome."
"Clojure seems like a lot.")
;=> "Clojure seems awesome."
do
With do
you can chain multiple expressions into one.
(if true
(do (println "Clojure seems awesome.")
(println "And more awesome with do."))
"Clojure seems like a lot.")
;Clojure seems awesome.
;And more awesome with do.
when
With when
you have a combination of if
and do
. You do not have an else
operand tho.
(when true
(println "Clojure seems awesome.")
(println "And more awesome with when."))
;Clojure seems awesome.
;And more awesome with when.
booleans and nil
There are true
and false
boolean values in Clojure. nil
represents the no value.
You can check if a value is nil
with nil?
expression.
(nil? 0)
;=> false
(nil? nil)
;=> true
Both nil
and false
stand for logical falseness, all other values are considered true.
(if "random string"
"this random string is true")
;=> "this random string is true"
(if nil
"nil is true"
"nil is false")
;=> "nil is false"
Equality operator is =
(= 1 1)
;=> true
(= 1 2)
;=> false
Clojure also has and
and or
operators. Those act bit differently than in other languages.
or
returns the first true value or the last value. Example:
(or false nil "this will be returned")
;=> "this will be returned"
(or (= 0 1) (= "a" "b"))
;=> false
(or nil)
;=> nil
and
returns the first falsey value, or the last truth value (if where are no false values)
(and "a" "b")
;=> "b"
(and "a" nil false)
;=> nil
Naming stuff
We can use def
to name values in Clojure.
(def shopping-list
["Vodka" "Apple jiuce" "Red Bull"])
shopping-list
;=> ["Vodka" "Apple juice" "Red Bull"]
Defining variables like this may seem a bit strange and hell of confusing when you would do multiple assignments into one name. This is something that should be reconsidered and done differently.
Let's do a small exercise that would demonstrate how to write code the Clojure way.
Let's image a following piece of Java code.
level = "info";
message = "message";
if (level.equals("info")) {
message = message + " (FYI)");
} else {
message = message + " (OMG)";
}
This is perfectly fine piece of code. My first instinct was do something like this:
(def level "info")
(def message "message")
(if (= level "info")
(def message (str message " (FYI)"))
(def message (str message " (OMG)")))
If you think about it and know about the defn
to define new operators. You can do something like this.
(defn error
[message level]
(str message
(if (= level "info")
" (FYI)"
" (OMG)")))
(error "message" "info")
;=> "message (FYI)"
You can follow me on Twitter to get more content like this.
Top comments (0)