注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

jiyinyiyong

/chenyong/, 1991, dreamer, coder

 
 
 

日志

 
 
关于我

http://tiye.me

文章分类
网易考拉推荐

Clojure 初学笔记  

2011-12-15 00:27:43|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
两篇教程
Guide to Programming in Clojure for Beginners
http://blackstag.com/blog.posting?id=5
Clojure Cookbook
http://www.gettingclojure.com/cookbook:clojure-cookbook
可用的类库, 可以去看代码
http://dev.clojure.org/display/doc/Clojure+Contrib
http://clojure.org/libraries
直接上文档看表达式和返回值很有效, 我漏了返回值, 比较缺

(source -) ; 查看减号 (-) 对应的源码
(doc reduce) ; 查看 reduce 函数定义过程的文档
'(+ 1 2) ; 单引号 (') 在前表示作为数据而非表达式
(fn? -) ; 判断是否为函数
(class 42) ; 查看类型
(count "123456") ; 计算长度
(fn [] (count "alphabet")) ; 匿名函数
(def a #(count "0123456")) ; 另一种匿名函数的定义
(def a #(+ (count "0123456") %)) ; 可以参数 (a 2) 会显示 9
(def a #(+ (count "0123456") %1 %2)) ; 带多个参数
(list "growl" "lick" "jump") ; 声明列表, 类似 '("growl" "lick" "jump")
(nth (list "growl" "lick" "jump") 2) ; 选取序数 2 的元素
(ran-int 5) ; 返回  [0, 1, 2, 3, 4, 5] 中随机一个

(defn select-random
    "Returns a random item from a list of items." ; 可选的描述
    {:added "1.2"} ; 可选的 metadata(?)
    [options]
    (nth options (rand-int (count options))))
(defn greeting [greeter whom] "result") ; 定义函数, 带一个参数或多个参数
(defn greeting
    ([greeter whom] "result1")
    ([greeter whom approach] "result2")
    ([greeter whom approach action] "result3")) ; 函数限定参数个数, 不足可用 nil, 也可以定义为匹配
(defn greeting [greeter whom & options] "result") ; & 后面是更多参数, (source -) 当中有例子
(meta #'select-random) ; 查看 metadata, 对应 (meta #'-) , 有关版本信息之类
(def approaches
    (with-meta
      (list "ferocious" "wimpy" "precarious")
      {:creator "tim"})) ; 可以为变量定义 metadata

Clojure 不仅编译到机器字节码, 还编译到 Java 字节码, 访问 Java 的类库
(class (new java.lang.Float 12.56)) ; Clojure 的数值是 Java 的对象
(Float. "12.56") ; 通过字符串创建浮点数, 注意点号 '.' 是必需的
(defn msec []
    (System/currentTimeMillis)) ; 调用 Java 的接口来获取时间
(import java.util.Date) ; 也可以导入 Java 的 Date 类库
(Data.) ; 得到时间, 注意点号 '.' 是必需的
(Data. 1307328017335) ; 可以获取时间戳对应的日期等等
(.format (SimpleDateFormat. (date 404534000000)) "yyyy/MM/dd HH:mm:ss")
.format 是  (.instanceMember instance arguments) , 具体不详

(use 'clojure.contrib.str-utils) ; 使用正则表达式, 需要安装 contrib
(re-split #" "  "2011 06 04 17 50 21") ; 分割字符串到列表
(class #" ") ; 返回值是 java.util.regex.Pattern , 具体要看 Java 的正则
不过这个教程不好 http://download.oracle.com/javase/tutorial/essential/regex/index.html

(let [id 1] (println id)) ; 局部变量, 可以覆盖全局变量, (即便全局变量 id 是 0)输出 1
(defn run-report [ ]
   (let [date (date-list)]
     (str "report ran " (nth date 3) ":" (nth date 4)))) ; let 关键字也用在函数上

List 类型
'("truck" "car" "bicycle" "plane") ; 定义 List, 或者用 list 关键字
(first vehicles) ; 取出第一个, 其他为 second/ last/ rest
(conj '("vehicles") "motorcycle") ; 添加到列表头部
Cons 类型
(cons "truck" (list "car")) ; cons 两个参数, 后者是 seq 类型(还可以 nil?), 返回 Cons 类型, 不是列表
(first (cons "truck" (list "car"))) ; 取第一个元素
(cons "truck" nil) ; 返回的却是 List 了, 诡异
(conj (cons "a" ()) "motorcycle") ; 返回 Cons 类型
Vector 类型, 比上述两种 Seq 类型更快
(vector "truck" "car" "bicycle") ; 或者直接方括号
(conj ["a"] "motorcycle") ; 返回 Vector 类型
Map 类型
(hash-map :truck "Toyota" :car "Subaru") ; 类型为 HashMap
{:truck "Toyota" :car "Subaru"} ; 使用花括号, 长度 (<9) 的, ArrayMap, (>=9) 的自动转 HashMap
函数能正确对待上述两种类型, 除了后者顺序会被打乱, 当然 Hash 也用不着顺序..
(sorted-map :truck "Toyota" :car "Subaru") ; 类型为 TreeMap, 可以保持顺序
 (keys {:s "d"}) ; 取出键, 返回 Map$KeySeq 类型
 (vals {:s "d"}) ; 取出值, 返回 Map$KeySeq 类型

transactional reference 是为了处理并行问题引入的
(ref (hash-map)) ; 返回 "#<Ref@52879daa: {}>"
(def vehicles (ref {:truck "Toyota" :car "Subaru"}))
vehicles 返回 "#<Ref@102a0a5: {:truck "Toyota", :car "Subaru", :plane "de Havilland"}>"
@vehicles ; 返回 {:truck "Toyota" :car "Subaru"} , 也可以用 (deref vehicles)
下面两行是修改 Map 内容的, 没看明白具体指什么
(dosync (alter vehicles assoc :car "Volkswagon")) ; {:plane "de Havilland", :truck "Toyota", :car "Volkswagon"}
(dosync (alter vehicles dissoc :car)) ; {:plane "de Havilland", :truck "Toyota"}
如果不在意内容, 下面的语句可以进行覆盖
(dosync (ref-set vehicles {:motorcycle "Ducati"})) ; {:motorcycle "Ducati"}
相对于 Refs, Atoms 的情形类似
(def vehicles (atom ["Toyota Tacoma" "Subaru Outback"]))
(deref vehicles) ; 相当于 @vehicles , 返回 ["Toyota Tacoma" "Subaru Outback"]
修改内容, 以下, 第一行修改, 第二行覆盖
(swap! vehicles conj "Ducati Diavel") ; ["Toyota Tacoma" "Subaru Outback" "Ducati Diavel"]
(reset! vehicles (take 2 @vehicles)) ; ("Toyota Tacoma" "Subaru Outback")

末尾列出了更多可以参考的资源
http://blackstag.com/blog.posting?id=23
也可以看这两份
Clojure Programming/Concepts
http://en.wikibooks.org/wiki/Clojure_Programming/Concepts
Clojure Cookbook
http://www.gettingclojure.com/cookbook:clojure-cookbook
  评论这张
 
阅读(317)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017