Clojure的语法非常的简单,只要熟悉Lisp,几乎可以无缝使用Clojure了。

Form

Clojure的代码是由一个一个form组成的,form可以是基本的数据结构,譬如number,string等,也可以是一个operation,对于一个operation来说,合法的结构如下:

(operator operand1 operand2 ... operandn)

第一个是operator,后面的就是该operator的参数,譬如(+ 1 2 3),operator就是“+”, 然后参数为1, 2, 3,如果我们执行这个form,得到的结果为6。

Control Flow

Clojure的control flow包括if,do和when。

If

If的格式如下:

(if boolean-form
    then-form
    optional-else-form)

如果boolean-form为true,就执行then-form,否则执行optional-else-form,一些例子:

user=> (if false "hello" "world")
"world"
user=> (if true "hello" "world")
"hello"
user=> (if true "hello")
"hello"
user=> (if false "hello")
nil

Do

通过上面的if可以看到,我们的then或者else只有一个form,但有时候,我们需要在这个条件下面,执行多个form,这时候就要靠do了。

user=> (if true
  #_=> (do (println "true") "hello")
  #_=> (do (println "false") "world"))
true
"hello"

在上面这个例子,我们使用do来封装了多个form,如果为true,首先打印true,然后返回“hello”这个值。

When

When类似if和do的组合,但是没有else这个分支了,

user=> (when true
  #_=> (println "true")
  #_=> (+ 1 2))
true
3

nil, true, false

Clojure使用nil和false来表示逻辑假,而其他的所有值为逻辑真,譬如:

user=> (if nil "hello" "world")
"world"
user=> (if "" "hello" "world")
"hello"
user=> (if 0 "hello" "world")
"hello"
user=> (if true "hello" "world")
"hello"
user=> (if false "hello" "world")
"world"

我们可以通过nil?来判断一个值是不是nil,譬如:

user=> (nil? nil)
true
user=> (nil? false)
false
user=> (nil? true)
false

也可以通过=来判断两个值是否相等:

user=> (= 1 1)
true
user=> (= 1 2)
false
user=> (= nil false)
false
user=> (= false false)
true

我们也可以通过and和or来进行布尔运算,or返回第一个为true的数据,如果没有,则返回最后一个,而and返回第一个为false的数据,如果都为true,则返回最后一个为true的数据,譬如:

user=> (or nil 1)
1
user=> (or nil false)
false
user=> (and nil false)
nil
user=> (and 1 false 2)
false
user=> (and 1 2)
2

def

我们可以通过def将一个变量命名,便于后续使用,譬如:

user=> (def a [1 2 3])
#'user/a
user=> (get a 1)
2