Clojure基本语法

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

Form

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

  1. (operator operand1 operand2 ... operandn)

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

Control Flow

Clojurecontrol flow包括ifdowhen

If

if的格式如下:

  1. (if boolean-form
  2. then-form
  3. optional-else-form)

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

  1. user=> (if false "hello" "world")
  2. "world"
  3. user=> (if true "hello" "world")
  4. "hello"
  5. user=> (if true "hello")
  6. "hello"
  7. user=> (if false "hello")
  8. nil

Do

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

  1. user=> (if true
  2. #_=> (do (println "true") "hello")
  3. #_=> (do (println "false") "world"))
  4. true
  5. "hello"

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

When

when类似ifdo的组合,但是没有else这个分支了,

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

nil, true, false

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

  1. user=> (if nil "hello" "world")
  2. "world"
  3. user=> (if "" "hello" "world")
  4. "hello"
  5. user=> (if 0 "hello" "world")
  6. "hello"
  7. user=> (if true "hello" "world")
  8. "hello"
  9. user=> (if false "hello" "world")
  10. "world"
  11. `

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

  1. user=> (nil? nil)
  2. true
  3. user=> (nil? false)
  4. false
  5. user=> (nil? true)
  6. false

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

  1. user=> (= 1 1)
  2. true
  3. user=> (= 1 2)
  4. false
  5. user=> (= nil false)
  6. false
  7. user=> (= false false)
  8. true

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

  1. user=> (or nil 1)
  2. 1
  3. user=> (or nil false)
  4. false
  5. user=> (and nil false)
  6. nil
  7. user=> (and 1 false 2)
  8. false
  9. user=> (and 1 2)
  10. 2

def

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

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