01. 环境搭建
Clojure 是什么?

运行环境搭建
由于
现在让我们打开
lein version
如果
Leiningen 2.8.1 on Java 1.8.0_144 Java HotSpot(TM) 64-Bit Server VM
使用REPL
所谓的
在
lein repl
之后会在
nREPL server started on port 49928 on host 127.0.0.1 - nrepl://127.0.0.1:49928
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_144-b01
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
user=>
我们试着在
user=> (println "Hello World!")
;; Hello World!
;=> nil
现在让我们把重点放到程序本身:
(println “Hello World!”)
在
至于
让我们再看一个简单的例子,使用
(+ 1 1)
;=> 2
没错,在
(* 3 (+ 1 2))
;=> 9
另一个优势是,前缀形式的(+)函数可以很自然的接受任意数量的参数:
(+ 1 2 3 4 5)
;=> 15
因此(+)函数很自然的能起到列表求和的作用:
(apply + [1 2 3 4 5])
;=> 15
文档查询
- 使用
doc 宏查询文档
我们可以用
(doc +)
;;-------------------------
;;clojure.core/+
;;([] [x] [x y] [x y & more])
;; Returns the sum of nums. (+) returns 0. Does not auto-promote
;; longs, will throw on overflow. See also: +'
;=> nil
在阅读
- 使用
find-doc 寻找文档
我们试着来求一下
(xor 1 0)
;=> CompilerException java.lang.RuntimeException: Unable to resolve symbol: xor in this context, compiling:(null:1:1)
哎呀!
(find-doc "xor")
;;-------------------------
;;clojure.core/bit-xor
;;([x y] [x y & more])
;; Bitwise exclusive or
;=> nil
原来函数名是
(bit-xor 0 1)
;=> 1
- 使用
javadoc 查询java 类库的文档:
(javadoc java.util.ArrayList)
使用Lein 新建Clojure 项目
使用
lein new learning-clojure
这样我们就创建了一个名为

项目的目录结构有点像
使用REPL 对项目进行测试
后缀名为
(ns learning-clojure.core) ; 声明命名空间
(defn foo ; 定义函数foo
"I don't do a whole lot." ; 这是foo函数的说明文档
[x] ; 这是foo函数的参数列表
(println x "Hello, World!")) ; 这是foo函数的函数体
上面的代码定义了一个简单的函数
接下来我们使用
(use ‘learning-clojure.core) ; <-注意此处的单引号
为什么这里要加上一个单引号呢?这是因为当
(a b c) ; 标识符a、b、c还不存在,无法求值
;=> CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(null:1:1)
‘(a b c) ; 加上单引号之后会返回列表本身
;=> (a b c)
(quote (a b c)) ; 单引号实际上是quote宏的简写形式
;=> (a b c)
引入命名空间之后我们就能使用
(foo "Bar")
;; Bar Hello, World!
;=> nil
现在让我们在
(defn hello
"Say hello to someone."
[name]
(str "Hello, " name))
保存修改之后,我们需要在
(use :reload ‘learning-clojure.core)
(hello “World!”)
;=> Hello, World!