蓝猫的专栏

在实践中积累经验,不断求索

Programming Clojure学习笔记——多重方法

8.5 何时使用多重方法 从Clojure的几个开源项目可以看出: 1. 多重方法使用极少 2. 很多多重方法都是基于类型(class)来分发 使用以下一个通用原则来决定创建函数很是多重方法: 1. 如果一个函数分支基于一种或多种类型,使用多重方法 2. 不管它是什么,当你发现它是...

2012-02-28 20:42:58

阅读数:691

评论数:0

Programming Clojure学习笔记——多重方法

8.4 创建非正式类别 多重方法让你可以创建非正式类别。 举例说明,考虑一个财务应用,处理活期存款帐户和储蓄存款账户。为帐户定义一个Clojure结构,通过tag为标识这两种账户: (ns examples.multimethods.account) (defstruct accoun...

2012-02-28 20:41:23

阅读数:873

评论数:0

Programming Clojure学习笔记——多重方法

8.3 超越简单的分发 定义一个打印集合的方法实现: (use '[clojure.contrib.str-utils :only (str-join)]) (defmethod my-print java.util.Collection [c]      (.write *out* &q...

2012-02-28 20:40:31

阅读数:627

评论数:0

Programming Clojure学习笔记——多重方法

8.2 定义多重方法 定义多重方法使用defmulti: (defmulti name dispatch-fn) name为多重方法的名字,Clojure将针对方法的参数调用dispatch-fn来选择多重方法的一个特定的方法(实现)。 考虑前一节的my-print函数,它只有一个参数...

2012-02-28 20:39:30

阅读数:1035

评论数:0

Programming Clojure学习笔记——多重方法

8.1 没有多重方法的生活 假定Clojure没有提供print和println方法,打印任何对象,println比print方法多输出一个换行符。我们自己构建一个通用的打印机制。 为了输出字符串,空,向量我们需要如下编写代码: (use '[clojure.contrib.str-util...

2012-02-28 20:38:40

阅读数:829

评论数:0

Programming Clojure学习笔记——宏

7.4 宏的分类 Clojure的特殊形式通常只能通过宏来实现,满足使用宏的第二个原则,因此宏的第二个原则也称为特殊形式原则。 特殊形式有一些特殊的功能: (1) 特殊形式提供了大部分基本的流控制结构,如if和recur等 (2) 特殊形式提供了直接访问Java的途径 (3) 命名的创建...

2012-02-19 00:20:16

阅读数:1098

评论数:0

Programming Clojure学习笔记——宏

7.3 使宏简单化 Clojure为宏作者提供的支持 形式                描述 foo#                在语法上被引号引起的区域内,创建一个以foo为前缀的唯一名称 (gensym prefix?)            以可选的前缀prefix创建唯一名称...

2012-02-19 00:17:46

阅读数:1419

评论数:0

Programming Clojure学习笔记——宏

7.2 编写控制流宏 实现unless功能,与if相反,条件不成立时执行unless后代码。 先编写函数来实现: user=> (defn unless [expr form] (if expr nil form)) 验证一下,当表达式expr为false时正确执行 user=&g...

2012-02-05 11:15:09

阅读数:1464

评论数:0

Programming Clojure学习笔记——宏

7.1 什么时候使用宏 使用宏的两个原则和一个例外: 原则1:不要写宏。宏很复杂而且需要仔细考虑宏展开时间和编译时间的相互影响。如果你能用一个函数替代就不要用宏。 原则2:只在当且仅当只有宏可以封装你的模式时才使用宏 例外:如果相比等效的函数,宏能使你的调用者生活变得更简单,那就用吧

2012-02-05 11:14:33

阅读数:595

评论数:0

Programming Clojure学习笔记——并发

6.5 使用Vars管理线程本地状态 当你调用def或defn创建一个动态变量时,只是创建了一个变量。 当你传一个初始值给def时,该初始值就成了def创建变量的根绑定(root binding),如: (def foo 10) 变量foo的根绑定被所有线程共享,验证如下: 当前线程中 ...

2012-02-05 11:09:02

阅读数:617

评论数:0

Programming Clojure学习笔记——并发

6.4 使用Agents进行异步更新 类似引用,可以使用代理(agent)包装初始状态。 (agent initial-state) 如创建counter代理包装初始计数0: (def counter (agent 0)) 可以send一个函数到agent修改agent的状态,该函数...

2012-02-05 11:07:05

阅读数:575

评论数:0

Programming Clojure学习笔记——并发

6.3 使用Atoms进行非并发同步修改 原子(Atoms)是一种比引用轻量的同步机制。 创建原子语法: (atom initial-state options?) 这里的选项options与引用refs的选项一样 示例: 使用atom存贮当前曲目代替引用ref (def curre...

2012-02-05 11:06:02

阅读数:467

评论数:0

Programming Clojure学习笔记——并发

6.2 引用和软件事务存贮 在Clojure中,大部分对象都是不可变的。当你真的需要可变数据时,你必须明确说明,如创建一个可变的引用指向可变对象: (ref initial-state) 如:(def current-track (ref "Mars, the Bringer of...

2012-02-05 11:04:54

阅读数:707

评论数:0

Programming Clojure学习笔记——并发

Clojure提供强大的并发库,由四个API组成,增强不同并发模型: 引用(refs): 管理对共享状态的并发同步修改 原子(atoms): 管理对共享状态的非并发同步修改 代理(agents): 管理对共享状态的异步修改 变量(vars): 管理线程本地状态 6.1 锁的问题 选...

2012-02-05 11:04:12

阅读数:450

评论数:0

Programming Clojure学习笔记——函数编程

5.4 再谈递归 相互递归:两个或两个以上函数之间互相调用。如: (declare my-odd? my-even?) (defn my-odd? [n]      (if (= n 0)          false          (my-even? (dec n)))) (d...

2012-02-05 10:50:15

阅读数:593

评论数:0

Programming Clojure学习笔记——函数编程

5.3 进一步延迟 通过组合已有的序列函数,可以找到不需要显式序列的更加延迟的办法。 举例说明,解决如下问题: 统计硬币投掷结果序列中,连续两次出现正面的次数,其中:h表示正面,:t表示反面。如: [:h :t :t :h :h :h] 第4、5连续两次,第5、6连续两次,一共出现2次 ...

2012-02-05 10:49:27

阅读数:576

评论数:0

Programming Clojure学习笔记——函数编程

5.2 如何延迟 函数编程大量使用递归定义,递归定义由两部分组成: (1) 基础,明确列出序列的一些元素 (2) 归纳,提供规则利用序列元素,生成更多的元素 Clojure中有多种方法实现递归: (1) 简单递归,使用函数调用自己实现归纳步 (2) 尾部递归,只在函数末尾调用函数自...

2012-02-05 10:48:22

阅读数:955

评论数:0

Programming Clojure学习笔记——函数编程

5.1 函数编程概念 1. 纯函数 函数式程序由纯函数构成。纯函数没有副作用,它只依赖与函数参数,只能通过函数返回值影响函数外部。 纯函数常常与不可变数据一起工作。如: (defn mystery [input]     (if input data-1 data-2)) 如果data...

2012-02-05 10:47:28

阅读数:756

评论数:0

Programming Clojure学习笔记——使用序列统一数据

4.5 调用特定结构函数 Clojure包含一些专门针对列表lists,向量vectors,映射maps,结构structs和集合sets的函数 1. 针对列表Lists的函数 (peek coll) 获取列表第一个元素,(peek '(1 2 3)) 返回1 (pop coll) 获取除...

2012-02-05 10:20:36

阅读数:1400

评论数:0

Programming Clojure学习笔记——使用序列统一数据

4.4 Clojure使Java可序列化 1. 序列访问Java集合 集合可以像序列一样操作称为可序列 数组可序列 user=> (first (.getBytes "hello")) 104 Hashtable和Map也可序列 user=> (fir...

2012-02-05 09:57:39

阅读数:1170

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭