SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
Clojure概览,[object Object],面向java程序员的clojure简介,[object Object],Dennis(killme2008@gmail.com),[object Object]
引子(1),[object Object],需求:按行读取文件,统计行数,[object Object],Java代码:31行代码,[object Object],Clojure代码:5行代码,[object Object],更好的方式:wc -l,[object Object]
引子(2),[object Object],需求:解析xml配置文件获取书名列表,[object Object],Java代码:51行代码,[object Object],Clojure代码:  6行代码,[object Object]
引子(3),[object Object],需求:贪吃蛇游戏,[object Object],Java代码:你认为要多少行?,[object Object],Clojure代码:244行 ,[object Object]
Why clojure?,[object Object],生产力,优雅,[object Object],语言不重要是扯淡,[object Object],元编程能力和DSLs,[object Object],并发,[object Object],与Java互操作容易,充分复用现有资源,[object Object],每年都应该学习一门新的编程语言,[object Object]
Clojure,[object Object],Lisp on JVM,[object Object],动态语言,[object Object],函数式语言,[object Object],作者:Rich  Hickey,[object Object],2007年10月第一次发布,[object Object],主页:http://clojure.org,[object Object]
Clojure概览
Lisp,[object Object],LIStProcessor,链表处理语言,[object Object],Lost In Stupid Parentheses,[object Object],由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言,[object Object],Lambda演算==图灵机,[object Object],主要方言:,[object Object],Scheme,[object Object],Commons Lisp,[object Object],Emacs Lisp,[object Object],Clojure,[object Object]
Clojure概览
函数式语言,[object Object],不同的人有不同的定义,[object Object],折中的定义:函数必须是first-class,意味着函数可以,[object Object],存储,[object Object],作为参数传递,[object Object],作为返回值返回,[object Object],很多人认为FP还应该包括:,[object Object],无副作用,[object Object],immutable,[object Object],高阶函数,[object Object],lazy and stream,[object Object],Continuation,[object Object],Pattern match,[object Object]
Clojure的优点,[object Object],小核心,[object Object],少数几个special form作为起点,[object Object],Sequences抽象,[object Object],宏(macro),[object Object],原生支持STM——软事务内存,并发编程更容易,更健壮。,[object Object],与Java互操作非常容易,[object Object],充分复用现有类库,[object Object]
Clojure概览
Hello World,[object Object],REPL——交互式编程环境,[object Object],user=> (println "hello" "world")                        ,[object Object],        hello world,[object Object],        nil,[object Object]
前缀运算符,[object Object],(op …), op可以为,[object Object],少数几个special form,[object Object],Macro,[object Object],返回函数的表达式,[object Object],前缀运算符:,[object Object],参数数目无限制,[object Object],(+ 1 2 3 4……),[object Object],优先级天然地通过括号表达式体现,忘记操作符优先级吧,[object Object],(+ 1 (* 2 3)),[object Object]
Code vs. Data,[object Object],从代码角度,[object Object],                            (println "hello world"),[object Object],函数        参数,[object Object],从数据角度,[object Object],                  (println "hello world"),[object Object],一个list,[object Object]
求值=解释数据结构,[object Object],Homoiconicity(同像性),[object Object],编程语言的一种属性,是指该语言的基本表现形式本身同时也是该语言自身的数据结构。,[object Object],元编程更容易,[object Object],Code is data  is code.,[object Object],求值等价于解释数据结构,[object Object],eval(analyze(list)),[object Object],比较传统求值模型和clojure求值模型,[object Object]
传统的求值模型,[object Object]
Clojure的求值模型,[object Object]
Clojure的数据类型,[object Object],Integer	–123456789,[object Object],Double	1.234,[object Object],BigDecimal1.234m,[object Object],Ratio               22/7,[object Object],Strings	"hello world”,[object Object],Characters 	  ,[object Object],Symbols	foo bar,[object Object],Keywords	:foo :bar,[object Object],Booleans	true false,[object Object],Null	                nil,[object Object],Regex patterns   #"[a-z]*+”,[object Object]
集合数据结构,[object Object],List    链表,[object Object],(1 2 3 4 5) (list  c)br />Vector  类似数组,索引访问,[object Object],[1 2 3 4 5] [foo bar],[object Object],Map   key/value结构,[object Object],{:a 1 :b 2} ,[object Object],Set   集合,不能重复,[object Object],#{foo bar},[object Object],全部可嵌套,定义更复杂的数据结构。,[object Object]
Persistent Data Structures,[object Object],Clojure的数据结构都是immutable的,[object Object],每次更新都将创建一个新的数据结构,[object Object],复制的开销,[object Object],解决方案:结构共享,Persistent数据结构,[object Object],Git的tree结构,[object Object],Couch DB的索引,[object Object],Clojure的数据结构,[object Object],http://en.wikipedia.org/wiki/Persistent_data_structure,[object Object],21,[object Object]
Persistent Data Structures,[object Object],22,[object Object]
Special Forms,[object Object],(defsymbol init?)  ,[object Object],定义全局变量,[object Object],(do exprs*),[object Object],顺序求值表达式,[object Object],(if test then else?),[object Object],条件语句,[object Object],(quote form),[object Object],返回不会被执行的form,[object Object],(fn name? ([params* ] exprs*)+),[object Object],匿名函数,[object Object],defn宏,[object Object],(let [bindings* ] exprs*),[object Object],在词法作用域内绑定值和变量,并求值表达式,[object Object],其他var loop recur try throw,[object Object]
loop和recur,[object Object],语言结构:顺序,条件和循环,[object Object],Clojure中没有专门的循环结构,而是通过递归来实现循环,[object Object],递归更符合人类直觉,[object Object],递归让代码更优雅,[object Object],loop与let类似,但是loop会创建一个递归点,允许recur递归跳转,[object Object],loop和recur并不是尾递归优化(TCO),[object Object]
Clojure概览
Macro,[object Object],Macro是Clojure元编程的主要方式,[object Object],扩展编译器,定义自己的语法结构,[object Object],DSLs,[object Object],什么是Macro?,[object Object],模板语言,[object Object],C语言的预处理器,[object Object],例子,[object Object],unless,[object Object],SQL DSLs,[object Object]
函数是一等公民——first class,[object Object],作为参数,[object Object],作为返回值,[object Object],作为变量保存,[object Object],defn宏定义函数,[object Object],高阶函数:操作函数的函数,[object Object],MapReduce,[object Object],Functional,[object Object]
高阶函数,[object Object],代码复用,[object Object],隔离可变部分,[object Object],站在更高的抽象层次去思考问题,[object Object],更易于并行,[object Object],更易于测试,[object Object]
高阶函数,[object Object],29,[object Object]
高阶函数,[object Object],以信息流的方式去组织代码,高阶函数带来了约定接口的抽象,[object Object],30,[object Object],range:,[object Object],integers,[object Object],map:,[object Object],fib,[object Object],filter:,[object Object],even?,[object Object]
Java Interop,[object Object],Clojue Strings  == Java Strings,[object Object],Clojure Numbers == Java Numbers,[object Object],Clojure Collections实现java.util.Collection接口,[object Object],Clojure函数实现Runnable和Callable接口,[object Object],Clojure可以继承和实现Java的类和接口,[object Object],Clojure的seq库可以直接使用在Java的String和Array以及Iterable,[object Object],31,[object Object]
实例,[object Object],(. Math PI)   ,[object Object],Math/PI,[object Object],(new java.util.Date) ,[object Object],(java.util.Date.),[object Object],(. date getYear),[object Object],(.getYear date),[object Object],(. (. System (getProperties)) (get "os.name")),[object Object],(.. System (getProperties) (get "os.name")),[object Object],(doto (JFrame.) (.add (JLabel. “hello world”)) .(pack) (.show)),[object Object],(int-array 3),[object Object],(aset a 0 1) (aget a 0) (alength a),[object Object],proxy和genclass,[object Object],32,[object Object]
Sequences,[object Object],传统Lisp中list的抽象和扩展,支持更多数据结构,[object Object],ISeq接口,[object Object],(cons item seq),[object Object],将item插入seq的首部创建新的seq,[object Object],(seqcoll),[object Object],如果集合为空,返回nil,否则返回集合的seq,[object Object],(first seq)  == (car list),[object Object],返回seq的第一个元素,[object Object],(rest seq)   == (cdr list),[object Object],返回seq除第一个元素之外的元组,如果没有则为(),[object Object]
Sequence(1),[object Object],34,[object Object]
Sequence(2),[object Object],大多数seq函数是lazy,返回lazy seqs,[object Object],Lazy,[object Object],延迟求值,[object Object],共产主义:按需供应,[object Object],Laziness与infinity,[object Object],例子,[object Object],35,[object Object]
Sequence(3),[object Object],(first (System/getProperties)),[object Object],#<Entry java.runtime.name=Java(TM) SE Runtime Environment>,[object Object],(rest (.getBytes "hello")),[object Object],(101 108 108 111),[object Object],(sort (re-seq #"+" "the quick brown fox")),[object Object],("brown" "fox" "quick" "the"),[object Object],(count (file-seq (java.io.File. "."))),[object Object],(with-open [rdr (reader “hello.clj”)],[object Object],             (count (line-seqrdr))),[object Object],xml-seq的例子:引子2,[object Object]
其他并发模型,[object Object],并发的一个关键点在于如何管理可变状态(mutable states),[object Object],状态一致性,[object Object],锁的方式:,[object Object],直接引用可变状态,[object Object],采用锁来保护,[object Object],悲观策略,[object Object],死锁,活锁,[object Object],不可组合,[object Object],错误恢复困难,[object Object],消息传递的方式:,[object Object],将可变状态作为不可变的消息传递,[object Object],没有共享状态,[object Object],复制的代价,[object Object],状态可能不一致,[object Object]
Clojure的并发,[object Object],Clojure的方式:,[object Object],间接引用不可变的数据结构,[object Object],STM,[object Object],编程更容易,[object Object],没有死锁,活锁的隐患,[object Object],事务重试的代价,[object Object],事务薄记的代价,[object Object],工具支持的缺乏,[object Object]
典型的OO方式,[object Object]
Clojure——间接引用,[object Object],值不可变,[object Object],取值需要经过deref,[object Object]
STM,[object Object],软事务内存,内存型数据库:ACI,没有D,[object Object],基于MVCC实现——多版本并发控制,[object Object],所有对ref的读都将在事务开始的时候“看到”一个一致的快照(Snapshot),以及该事务内对ref所做的更改。,[object Object],所有在事务内对ref所做的更改,在外部看来都将是一个时间点触发的。,[object Object],写冲突,[object Object],abort and retry,[object Object],Barge,[object Object],没有死锁,活锁的隐患,[object Object]
四种模型,[object Object],Ref、Atomic、Agent和ThreadLocalvars,[object Object],协作/独立:状态是否与其他状态共同作用,[object Object],同步/异步:状态的更新是同步还是异步,[object Object]
Ref和事务,[object Object],(def songs (ref #{})),[object Object],创建ref,[object Object],@songs,[object Object],取ref的值,[object Object],reset,[object Object],改变ref指向的值,需要包装在事务里,[object Object],dosync,[object Object],启动事务,包装操作,一个事务内可更新多个ref,[object Object],alter,[object Object],查询并更新,[object Object],commute,[object Object],更新操作是可交换的,符合交换律,[object Object]
Atomic,[object Object],管理独立的可变状态,类似Java的AtomicReference(内部实现),[object Object],(defmem (atom {})),[object Object],创建atom,[object Object],@meme,[object Object],取值,[object Object],(reset! mem {:a 1}),[object Object],设值,无需事务,[object Object],(swap! memassoc :b 2),[object Object],查询并更新,[object Object],(compare-and-set! memoldValuenewValue),[object Object],原子的比较更新,[object Object],适合实现缓存 memoize,[object Object]
Agent,[object Object],用于异步的状态更新,[object Object],(def counter (agent 0)),[object Object],创建agent,[object Object],@counter,[object Object],取值,[object Object],(send counter inc),[object Object],发送任务,适合非阻塞任务,[object Object],(send-off counter inc),[object Object],发送任务,适合阻塞型任务,如IO操作,[object Object],(await counter),[object Object],等待任务结束,[object Object],每个agent每次只执行一个任务,同一个线程发送的任务有序,[object Object],可以在事务中使用,那么当且仅当事务commit成功的时候发送任务,[object Object]
可能是问题……,[object Object],没有尾递归优化,[object Object],recur仅能在方法内,goto指令,[object Object],受限于JVM的安全模型,[object Object],所有JVM之上的函数式语言都有这个问题,[object Object],使用Java数值类型的包装类型以及Cojure独有的Ratio,[object Object],Integer,Long,BigInteger etc.,[object Object],数值在heap上,算术运算性能欠佳,[object Object],Agent无法自定义线程池,[object Object],线程没有命名,[object Object],无法高效利用线程池,[object Object],弱类型,没有scala那样强大的类型推断能力,需要用户介入,[object Object],Type hint,[object Object],FP,小众中的小众,[object Object]
参考资料,[object Object],http://clojure.org/,[object Object],http://clojuredocs.org/,[object Object],不错的网络教程,[object Object],clojure相关资料,[object Object],http://cnlojure.org,[object Object],书籍推荐:,[object Object]
QA,[object Object]

Weitere ähnliche Inhalte

Was ist angesagt?

Golangintro
GolangintroGolangintro
Golangintro理 傅
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 
少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月鍾誠 陳鍾誠
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移wang hongjiang
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1Zianed Hou
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisXiaoming Chen
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3ArBing Xie
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
Jdbc中操作Blob、Clob等对象
Jdbc中操作Blob、Clob等对象Jdbc中操作Blob、Clob等对象
Jdbc中操作Blob、Clob等对象yiditushe
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
Object-Based Programming Part II
Object-Based Programming Part IIObject-Based Programming Part II
Object-Based Programming Part IIPingLun Liao
 

Was ist angesagt? (19)

Golangintro
GolangintroGolangintro
Golangintro
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月少年科技人雜誌 2015 年八月
少年科技人雜誌 2015 年八月
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
 
线程与并发
线程与并发线程与并发
线程与并发
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
Row Set初步学习V1.1
Row Set初步学习V1.1Row Set初步学习V1.1
Row Set初步学习V1.1
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
Jdbc中操作Blob、Clob等对象
Jdbc中操作Blob、Clob等对象Jdbc中操作Blob、Clob等对象
Jdbc中操作Blob、Clob等对象
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
A
AA
A
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
Object-Based Programming Part II
Object-Based Programming Part IIObject-Based Programming Part II
Object-Based Programming Part II
 

Andere mochten auch

Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Leonardo Borges
 
不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsしてmitsutaka mimura
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMsunng87
 
A little exercise with clojure macro
A little exercise with clojure macroA little exercise with clojure macro
A little exercise with clojure macroZehua Liu
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojuresohta
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Leonardo Borges
 
我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具dennis zhuang
 
Clojure 1.8 Direct-Linking WWH
Clojure 1.8  Direct-Linking  WWHClojure 1.8  Direct-Linking  WWH
Clojure 1.8 Direct-Linking WWHdennis zhuang
 
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...AboutYouGmbH
 
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものsohta
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)Jacek Laskowski
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 

Andere mochten auch (20)

点评新架构
点评新架构点评新架构
点评新架构
 
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
Clojure Macros Workshop: LambdaJam 2013 / CUFP 2013
 
不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして不自然なcar/ナチュラルにconsして
不自然なcar/ナチュラルにconsして
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVM
 
Patterns
PatternsPatterns
Patterns
 
Writing Macros
Writing MacrosWriting Macros
Writing Macros
 
A Dive Into Clojure
A Dive Into ClojureA Dive Into Clojure
A Dive Into Clojure
 
A little exercise with clojure macro
A little exercise with clojure macroA little exercise with clojure macro
A little exercise with clojure macro
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScript
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojure
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012
 
我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具
 
Clojure 1.8 Direct-Linking WWH
Clojure 1.8  Direct-Linking  WWHClojure 1.8  Direct-Linking  WWH
Clojure 1.8 Direct-Linking WWH
 
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
Stefan Richter - Writing simple, readable and robust code: Examples in Java, ...
 
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
 
Elixir introd
Elixir introdElixir introd
Elixir introd
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)
 
Clojure: a LISP for the JVM
Clojure: a LISP for the JVMClojure: a LISP for the JVM
Clojure: a LISP for the JVM
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
DSL in Clojure
DSL in ClojureDSL in Clojure
DSL in Clojure
 

Ähnlich wie Clojure概览

Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionFrank S.C. Tseng
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發koji lin
 
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程kidmany2001
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫建興 王
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo dbLucien Li
 
Simple tech-talk
Simple tech-talkSimple tech-talk
Simple tech-talkliltos
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 
Information Retrieval
Information RetrievalInformation Retrieval
Information Retrievalyxyx3258
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成fangdeng
 
高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践孙立
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程dyzm_2000
 
Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南HonestQiao
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
Postgre sql intro 0
Postgre sql intro 0Postgre sql intro 0
Postgre sql intro 0March Liu
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)Yan Li
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)Yan Li
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openpartylitaocheng
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Chun-Min Chang
 

Ähnlich wie Clojure概览 (20)

Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 
山頂洞人日記 - 回歸到最純樸的開發
山頂洞人日記 -  回歸到最純樸的開發山頂洞人日記 -  回歸到最純樸的開發
山頂洞人日記 - 回歸到最純樸的開發
 
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫lwdba – 開放原始碼的輕量級資料庫存取程式庫
lwdba – 開放原始碼的輕量級資料庫存取程式庫
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
Simple tech-talk
Simple tech-talkSimple tech-talk
Simple tech-talk
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 
Information Retrieval
Information RetrievalInformation Retrieval
Information Retrieval
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程
 
Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
Postgre sql intro 0
Postgre sql intro 0Postgre sql intro 0
Postgre sql intro 0
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openparty
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight
 

Mehr von dennis zhuang

一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生dennis zhuang
 
Java 与 CPU 高速缓存
Java 与 CPU 高速缓存Java 与 CPU 高速缓存
Java 与 CPU 高速缓存dennis zhuang
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战dennis zhuang
 
AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台dennis zhuang
 
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍dennis zhuang
 
Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎dennis zhuang
 
Java多线程常见陷阱
Java多线程常见陷阱Java多线程常见陷阱
Java多线程常见陷阱dennis zhuang
 

Mehr von dennis zhuang (14)

一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生
 
Erlang scheduler
Erlang schedulerErlang scheduler
Erlang scheduler
 
Java 与 CPU 高速缓存
Java 与 CPU 高速缓存Java 与 CPU 高速缓存
Java 与 CPU 高速缓存
 
Mesos intro
Mesos introMesos intro
Mesos intro
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
 
CQL 实现
CQL 实现CQL 实现
CQL 实现
 
Hystrix 介绍
Hystrix 介绍Hystrix 介绍
Hystrix 介绍
 
AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台
 
Avoscloud 2
Avoscloud 2Avoscloud 2
Avoscloud 2
 
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
 
Nio trick and trap
Nio trick and trapNio trick and trap
Nio trick and trap
 
Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎
 
Erlang简介
Erlang简介Erlang简介
Erlang简介
 
Java多线程常见陷阱
Java多线程常见陷阱Java多线程常见陷阱
Java多线程常见陷阱
 

Kürzlich hochgeladen

SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxNCU MCL
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptxNCU MCL
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptxNCU MCL
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven designJamie (Taka) Wang
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_patternJamie (Taka) Wang
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】黑客 接单【TG/微信qoqoqdqd】
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxNCU MCL
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLPJamie (Taka) Wang
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptxNCU MCL
 
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptxNCU MCL
 

Kürzlich hochgeladen (15)

20200323 - AI Intro
20200323 - AI Intro20200323 - AI Intro
20200323 - AI Intro
 
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven design
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_pattern
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
 
20200226 - AI Overview
20200226 - AI Overview20200226 - AI Overview
20200226 - AI Overview
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
 
20161027 - edge part2
20161027 - edge part220161027 - edge part2
20161027 - edge part2
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
 
20151111 - IoT Sync Up
20151111 - IoT Sync Up20151111 - IoT Sync Up
20151111 - IoT Sync Up
 

Clojure概览

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 8.
  • 10.
  • 11.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.