Programming Clojure学习笔记——开始

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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值