Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clojure Introduction (Chinese)

Clojure Introduction (Chinese)

Introduce clojure language, very simple tutor about clojure.
Chinese

4e9f69a9d4c6243111a6d19270a75255?s=128

Yu Xin

June 12, 2013
Tweet

Transcript

  1. Clojure⼊入⻔门 技术六部 ⺩王东永 13年6月2⽇日星期⽇日

  2. Clojure • Lisp on JVM • 动态语⾔言 • 函数式语⾔言 •

    http://clojure.org (稳定版1.5.1,1.6 Alpha) 13年6月2⽇日星期⽇日
  3. 函数式编程 • 定义很多,仁者⻅见仁,智者⻅见智 • 泛函编程,是⼀一种编程范型,它将电脑 运算视为数学上的函数计算,并且避免 状态以及可变数据。 • 运算过程尽量写成⼀一系列嵌套的函数调 ⽤用

    • 函数式编程是⼀一种编程模型,他将计算 机运算看做是数学中函数的计算,并且 避免了状态以及变量的概念 13年6月2⽇日星期⽇日
  4. FP的特点 闭包和⾼高阶函数 函数是头等公民,参数,返回值 惰性计算 在需要产⽣生表达式的值时进⾏行计算 递归 控制流程的机制 引⽤用透明性 对函数的调⽤用可以被替换,却不会影响程序的⾏行为,惰性计算依赖该特 性

    “⽆无”副作⽤用 FP 语⾔言不包含任何赋值语句,变量值⼀一旦被指派就永远不会改变 13年6月2⽇日星期⽇日
  5. FP的优势 • 容易开发 • 容易阅读 • 容易测试 • 容易组合 •

    易于并发 • ..... 13年6月2⽇日星期⽇日
  6. cont. 数学表达式 过程式编程 函数式编程 13年6月2⽇日星期⽇日

  7. cont. 13年6月2⽇日星期⽇日

  8. Clojure:Not Only FP • 所有的Java类型/类库都可直接使⽤用 • 不可变性 (Immutability) • 性能优秀的Persistent

    Data Structure • 做到Immutable的同时兼顾性能 • 强⼤大的Sequence⽀支持/Lazy Sequence • 宏 13年6月2⽇日星期⽇日
  9. cont. • 对并发⽀支持良好 • Immutability本⾝身就对并发友好 • 可变状态是并发的天敌 • ⽀支持STM +

    多种并发模型可⽤用 • Atom,Ref,Agent 多线程 • Var 线程本地 13年6月2⽇日星期⽇日
  10. Clojure现状 • Open Source • Storm • Cascalog • ClojureScript

    • leiningen • ... • 公司 • Amazon? • Twitter • Prismatic • 天涯 • 美味书签 13年6月2⽇日星期⽇日
  11. Clojure at GitHub 13年6月2⽇日星期⽇日

  12. Clojure at GitHub 13年6月2⽇日星期⽇日

  13. Java程序员最应该学习 的FP 13年6月2⽇日星期⽇日

  14. • Leiningen is for automating Clojure projects without setting your

    hair on fire. • ⾯面向Clojure的构建⼯工具 • https://github.com/technomancy/leiningen • http://clojars.org/ Leiningen 13年6月2⽇日星期⽇日
  15. 第⼀一个Clojure⼯工程 • $ lein new demo • $ cd demo

    && lein deps && lein pom • 将⼯工程导⼊入到IDEA 13年6月2⽇日星期⽇日
  16. REPL • Read-Eval-Print Loop • 先编译,再执⾏行 • 交互式编程环境 • $

    lein repl 13年6月2⽇日星期⽇日
  17. REPL • Read-Eval-Print Loop • 先编译,再执⾏行 • 交互式编程环境 • $

    lein repl 13年6月2⽇日星期⽇日
  18. Hello World 13年6月2⽇日星期⽇日

  19. Hello World 13年6月2⽇日星期⽇日

  20. Hello World 13年6月2⽇日星期⽇日

  21. Clojure语法 • Clojure语法: (operator operands*) • (println “hello”) • (+

    1 2 3) • (def value 2) • (defn hello [x] (println “Hello,” x)) 13年6月2⽇日星期⽇日
  22. (operator ...) • operator 可以是以下内容 • special form: def,let,fn,if •

    宏:when,if-not,ns • 函数:println,+,-,*,/ • 前缀表达式 • (+ 1 2 3 4) (+ 1 (* 3 2)) 13年6月2⽇日星期⽇日
  23. 同像性 • Homoiconicity • 编程语⾔言的⼀一种属性,该语⾔言的基本表 现形式本⾝身也是该语⾔言⾃自⾝身的数据结 构 • Code is

    data,data is code. • 求值等于解析数据结构 13年6月2⽇日星期⽇日
  24. Code VS. Data • (+ 1 2) => 3 •

    (def plus-3 (list ‘+ 1 2)) • (type plus-3) => clojure.lang.PersistentList • (eval plus-3) => 3 函数 参数 Code 数据 13年6月2⽇日星期⽇日
  25. Clojure的数据类型 • Integer 123 • Double 1.234 • BigDecimal 1.234m

    • Ratio 1/2 • String “Hello” • Character \a \b • Symbol ‘println • Keyword :key • Null nil • Boolean true false|nil • Regex #”123” 13年6月2⽇日星期⽇日
  26. 集合数据结构 • list 链表 • ‘(1 2 3) (list 1

    2 3) • vector 类似数组 • [1 2 3] • map key/value • {:id 1 :value 2} • set 集合 • #{1 2 3} • 都是⾮非可变的 • Persistent Data Structure 13年6月2⽇日星期⽇日
  27. Persistent Data Structure • Clojure内置的数据结构都是不可变的 • 每次更新会创建⼀一个新的数据结构 • 如果复制引起性能问题 •

    解决⽅方案:共享数据,持久数据结构 13年6月2⽇日星期⽇日
  28. cont. • (def a ‘(1 2)) => (1 2) •

    (def b (cons 0 a)) => (0 1 2) 13年6月2⽇日星期⽇日
  29. 集合和Seq操作 13年6月2⽇日星期⽇日

  30. 集合和Seq操作 13年6月2⽇日星期⽇日

  31. 集合和Seq操作 13年6月2⽇日星期⽇日

  32. 集合和Seq操作 13年6月2⽇日星期⽇日

  33. 集合和Seq操作 13年6月2⽇日星期⽇日

  34. 集合和Seq操作 13年6月2⽇日星期⽇日

  35. 集合和Seq操作 13年6月2⽇日星期⽇日

  36. 集合和Seq操作 13年6月2⽇日星期⽇日

  37. forms • When a list is used to perform an

    operation, it is called a form. • forms • 函数 • 宏 • special forms (built-in forms) 13年6月2⽇日星期⽇日
  38. special forms • (def symbol a) • 定义全局变量 • (do

    exprs*) • 顺序求值表达式 • (if test then else) • 条件语句 • (fn name? [params* ] exprs*) • 定义函数 • (let [bindings* ] exprs*) • 绑定值和变量 • var,loop,recur,try,thro w ... 13年6月2⽇日星期⽇日
  39. loop 和 recur • Clojure没有专⻔门的循环结构,通过递归实 现 • loop + recur

    • loop 建⽴立递归点,recur跳转到递归点 13年6月2⽇日星期⽇日
  40. loop 和 recur • Clojure没有专⻔门的循环结构,通过递归实 现 • loop + recur

    • loop 建⽴立递归点,recur跳转到递归点 1. recur in other than a tail position is an error 2. recur is the only non-stack-consuming looping construct in Clojure 3.recur is functional and its use in tail-position is verified by the compiler. 13年6月2⽇日星期⽇日
  41. 宏 • 宏是Clojure元编程的主要⽅方式 • 扩展编译器,定义⾃自⼰己的语法结构 • DSL • 编译期⽣生效 13年6月2⽇日星期⽇日

  42. cont. 13年6月2⽇日星期⽇日

  43. cont. 13年6月2⽇日星期⽇日

  44. 函数 • 函数是⼀一等公民 • 参数 • 返回值 • 变量 •

    defn定义函数 13年6月2⽇日星期⽇日
  45. 函数 • 函数是⼀一等公民 • 参数 • 返回值 • 变量 •

    defn定义函数 13年6月2⽇日星期⽇日
  46. ⾼高阶函数 • 所谓⾼高阶函数,是指接受函数作为参数,或 者把函数作为返回值的函数 • Cojure提供了很多⾼高阶函数: • map,reduce,partial,comp,complement... 13年6月2⽇日星期⽇日

  47. cont. 问题 Java Clojure 求数组中 0的个数 int [] a =

    {0,2,3}; int count =0; for(int i=0;i<a.length;i++){ if(a[i] == 0){ count++; } } return count; (count (filter zero? [0 2 3 ])) 13年6月2⽇日星期⽇日
  48. 与Java互操作 • Clojure String = Java String • Clojure Number

    = Java Number • Clojure Collection实现 java.util.Collection (只 读) • Clojure函数实现了 Runnable和Callable接⼝口 • Clojure可以继承和实现 Java的类和接⼝口 • Clojure seq操作可以直 接⽤用于String,数组及 Iterable 13年6月2⽇日星期⽇日
  49. cont. • (. Math PI) • Math/PI • (new java.util.Date)

    • (java.util.Date.) • (. date getYear) • (.getYear date) 13年6月2⽇日星期⽇日
  50. STM • Software Transactional Memory 13年6月2⽇日星期⽇日

  51. ⾯面向对象(Protocols) 13年6月2⽇日星期⽇日

  52. More • multi-methods • defrecord / deftype • ns (命名空间)

    • macro • ... 13年6月2⽇日星期⽇日
  53. 应⽤用例⼦子 • devops-alarm 项⺫⽬目介绍 • application/web/test • compojure/ring/hiccup/jetty • ClojureScript

    • lein run / lein test/lein uberjar • java -jar 启动 13年6月2⽇日星期⽇日
  54. 参考资料 • http://clojure.org http://clojuredocs.org 13年6月2⽇日星期⽇日

  55. Q & A 13年6月2⽇日星期⽇日