1.2 Clojure编程快速开始
Clojure的运行条件:
(1) Java运行环境,JDK5.0及以上
(2) Clojure包
运行REPL(read-eval-print-loop):
>set PATH=D:\Java\jdk1.5.0\BIN
>set CLOJURE_HOME=G:\Downloads\Clojure\clojure-1.3.0
>java -cp clojure-1.3.0.jar clojure.main
特殊变量
REPL包含一些特殊变量
1. 变量*1,*2,*3分别指向REPL中最近使用的三个表达式
user=> (defn hello [name] (str "Hello, " name))
#'user/hello
user=> (hello "Stu")
"Hello, Stu"
user=> (hello "Jim")
"Hello, Jim"
user=> (hello "Tom")
"Hello, Tom"
user=> (str *1 " and " *2 " and " *3)
"Hello, Tom and Hello, Jim and Hello, Stu"
2. *e变量指向上一个异常对象
user=> (/ 1 0)
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)
user=> (.printStackTrace *e)
java.lang.ArithmeticException: Divide by zero
at clojure.lang.Numbers.divide(Numbers.java:156)
at clojure.lang.Numbers.divide(Numbers.java:3677)
at user$eval13.invoke(NO_SOURCE_FILE:8)
at clojure.lang.Compiler.eval(Compiler.java:6465)
at clojure.lang.Compiler.eval(Compiler.java:6431)
at clojure.core$eval.invoke(core.clj:2795)
at clojure.main$repl$read_eval_print__5967.invoke(main.clj:244)
at clojure.main$repl$fn__5972.invoke(main.clj:265)
at clojure.main$repl.doInvoke(main.clj:265)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.main$repl_opt.invoke(main.clj:331)
at clojure.main$main.doInvoke(main.clj:427)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.Var.invoke(Var.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.Var.applyTo(Var.java:518)
at clojure.main.main(main.java:37)
nil
说明:Clojure异常都是Java异常,因此可以调用Java异常对象的方法printStackTrace打印堆栈信息
添加共享状态
接下来写一个跟踪访问者的Hello函数,使用集合来存贮访问者。
预备知识
1. #{} 表示一个空集合
2. (conj coll item) 将元素item加入集合coll
user=> (conj #{} "Stu")
#{"Stu"}
3. (ref initial-state) 引用initial-state数据
4. (def symbol initial-value?) 给数据或引用命名
user=> (def visitors #{})
#'user/visitors
user=> (str visitors)
"#{}"
5. (alter r update-fn & args) 修改引用数据,参数args可选
6. (dosync & exprs) 创建事务,在事务中执行表达式exprs
user=> (def visitors (ref #{}))
#'user/visitors
user=> (dosync (alter visitors conj "Stu"))
#{"Stu"}
7. (deref ref-name) 或 @ref-name 查看引用数据或引用变量值
user=> (deref visitors)
#{"Stu"}
user=> @visitors
#{"Stu"}
完整代码:
user=> (defn hello
"Writes hello message to *out*. Calls you by username.
Knows if you have been here before."
[username]
(dosync
(let [past-visitor (@visitors username)]
(if past-visitor
(str "Welcome back, " username)
(do
(alter visitors conj username)
(str "Hello, " username))))))
#'user/hello
user=> (hello "Rich")
"Hello, Rich"
user=> (hello "Rich")
"Welcome back, Rich"
Clojure的运行条件:
(1) Java运行环境,JDK5.0及以上
(2) Clojure包
运行REPL(read-eval-print-loop):
>set PATH=D:\Java\jdk1.5.0\BIN
>set CLOJURE_HOME=G:\Downloads\Clojure\clojure-1.3.0
>java -cp clojure-1.3.0.jar clojure.main
特殊变量
REPL包含一些特殊变量
1. 变量*1,*2,*3分别指向REPL中最近使用的三个表达式
user=> (defn hello [name] (str "Hello, " name))
#'user/hello
user=> (hello "Stu")
"Hello, Stu"
user=> (hello "Jim")
"Hello, Jim"
user=> (hello "Tom")
"Hello, Tom"
user=> (str *1 " and " *2 " and " *3)
"Hello, Tom and Hello, Jim and Hello, Stu"
2. *e变量指向上一个异常对象
user=> (/ 1 0)
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:156)
user=> (.printStackTrace *e)
java.lang.ArithmeticException: Divide by zero
at clojure.lang.Numbers.divide(Numbers.java:156)
at clojure.lang.Numbers.divide(Numbers.java:3677)
at user$eval13.invoke(NO_SOURCE_FILE:8)
at clojure.lang.Compiler.eval(Compiler.java:6465)
at clojure.lang.Compiler.eval(Compiler.java:6431)
at clojure.core$eval.invoke(core.clj:2795)
at clojure.main$repl$read_eval_print__5967.invoke(main.clj:244)
at clojure.main$repl$fn__5972.invoke(main.clj:265)
at clojure.main$repl.doInvoke(main.clj:265)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.main$repl_opt.invoke(main.clj:331)
at clojure.main$main.doInvoke(main.clj:427)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.Var.invoke(Var.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.Var.applyTo(Var.java:518)
at clojure.main.main(main.java:37)
nil
说明:Clojure异常都是Java异常,因此可以调用Java异常对象的方法printStackTrace打印堆栈信息
添加共享状态
接下来写一个跟踪访问者的Hello函数,使用集合来存贮访问者。
预备知识
1. #{} 表示一个空集合
2. (conj coll item) 将元素item加入集合coll
user=> (conj #{} "Stu")
#{"Stu"}
3. (ref initial-state) 引用initial-state数据
4. (def symbol initial-value?) 给数据或引用命名
user=> (def visitors #{})
#'user/visitors
user=> (str visitors)
"#{}"
5. (alter r update-fn & args) 修改引用数据,参数args可选
6. (dosync & exprs) 创建事务,在事务中执行表达式exprs
user=> (def visitors (ref #{}))
#'user/visitors
user=> (dosync (alter visitors conj "Stu"))
#{"Stu"}
7. (deref ref-name) 或 @ref-name 查看引用数据或引用变量值
user=> (deref visitors)
#{"Stu"}
user=> @visitors
#{"Stu"}
完整代码:
user=> (defn hello
"Writes hello message to *out*. Calls you by username.
Knows if you have been here before."
[username]
(dosync
(let [past-visitor (@visitors username)]
(if past-visitor
(str "Welcome back, " username)
(do
(alter visitors conj username)
(str "Hello, " username))))))
#'user/hello
user=> (hello "Rich")
"Hello, Rich"
user=> (hello "Rich")
"Welcome back, Rich"