`
flyfoxs
  • 浏览: 297679 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

一段关于Clojure (事务) 代码的分析

阅读更多

 

这段代码截取于:<<Clojure程序设计>>第五章, Programming Clojure, 2nd edition:

 

以后有空,会写一个Clojure于Oracle事物和MVCC的比较,

 

附件是这本书的英文版本.

 

(defrecord Message [sender text]) ;定义了一个Message对象,这个对象的构造函数有二个参数:sender, text

(def messages (ref ())) ;定义了一个空的ref, 用来存储所有的Message

(def backup-agent (agent "messages-backup.clj")) ;定义了一个Agent,用来存储文件名, 为什么需要定义成Agent?

(defn add-message-with-backup [msg] ;定义了一个函数,用来往message中添加消息
;开启了一个事务
  (dosync  
;合并/添加新消息到已有消息里面, 并将合并后的消息绑定到snapshot
   (let [snapshot (commute messages conj msg)] 
;send-off 一个匿名函数给 backup-agent
     (send-off backup-agent (fn [filename]
;将合并后的消息,输出到文件做持久化,类似于ACID中的Duration 	 
			      (spit filename snapshot) 
;把filename作为函数的返回值,也就是函数入参直接作为返回值; 
;如果不执行这一行,第一次执行不会有任何错误.但是当第二次执行就会出现异常,;
 因为backup-agent已经不再存储的filename,而是(spit filename snapshot).				  
		 			       filename 
				  ))			  
;打印最新合并后的消息到控制台,作为整个事务结束的输出消息					  
     snapshot 
	 )))
	 
(add-message-with-backup (user.Message. "John" "Message One")) ;user是默认的名称空间 Message. 对应于Java里面的new Message(); ;John是构造函数的参数一, "Message One"是构造函数的参数二.	

(add-message-with-backup (str "Normal Message")) ;add-message-with-backup不仅仅可以输入Message对象,也可以输入一个普通的字符串
 

 

分享到:
评论

相关推荐

    Clojure Handbook(2012.11.1)

    Clojure Handbook是一份关于Clojure编程语言的学习笔记,旨在为读者提供一个方便的备查材料,以加深对Clojure语言特性的理解和记忆。 首先,Clojure作为Lisp语言家族的一员,具有一些独特的特性。Lisp语言以其极简...

    Clojure Handbook (by jamesqiu).pdf

    1.3 STM模型(软件事务内存):Clojure引入了STM模型,它是一种内存管理机制,用于简化并发编程。 1.4 基于JVM:Clojure运行在JVM之上,可以利用Java平台丰富的库和工具。 1.5 Clojure是LISP的重新实现:Clojure是...

    redis-atom:使用一行代码通过redis在服务之间共享Clojure原子

    总的来说,Redis-Atom为Clojure开发者提供了一种优雅的方式来解决分布式系统中的状态共享问题,使得他们可以在不牺牲代码简洁性的同时,享受到分布式计算的便利。通过这个库,你可以构建可扩展且高度协调的应用程序...

    sentry-clj:用于Clojure的Sentry SDK

    Sentry-clj是专门为Clojure编程语言设计的一个SDK,它允许开发者集成Sentry服务,以便进行错误跟踪和崩溃报告。在Clojure应用开发中,确保软件的稳定性和性能至关重要,而sentry-clj就是这样一个工具,它能帮助...

    clojureql:ClojureQL是Clojure的高级SQL集成

    ClojureQL是一个专门为Clojure编程语言设计的高级SQL集成库,它允许Clojure开发者以更加自然和函数式的方式来处理数据库查询。这个库的目标是提供一个简洁、强大的领域特定语言(DSL),使得在Clojure中编写SQL变得...

    suricatta:Clojure的高级SQL工具包(由jooq库支持)

    这段代码构建了一个从"users"表中选择"id"和"name"的SQL查询,其简洁性和表达性不言而喻。 接下来,Suricatta对jOOQ的支持使其能够充分利用jOOQ的类型安全和强大的API。jOOQ库提供了丰富的功能,如动态SQL、元数据...

    datomic-study-master.rar

    通过对这些源码的阅读和分析,我们可以了解到Datomic如何实现分布式事务、如何优化查询性能,以及如何利用Clojure语言特性构建高度可扩展的系统。 六、实战应用与案例 理解Datomic的源码不仅可以帮助我们掌握其...

    clj-intro:午餐学习 2015 年 5 月

    【标题】"clj-intro:午餐学习 2015 年 5 月" 指的是一场关于Clojure编程语言的学习活动,可能是一个系列教程或研讨会,发生在2015年5月的某次午餐时间。这次活动的目的可能是为了让参与者深入了解Clojure,一种基于...

    nomnom.lockjaw::locked_with_key:PG咨询锁作为组件

    3. **临时独占访问**:当需要确保某段代码在任何时刻只被一个事务执行时,可以使用咨询锁。 在Clojure编程环境中,`nomnom.lockjaw`项目可能是为了解决上述问题而设计的一个组件。Clojure是一种静态类型的函数式...

Global site tag (gtag.js) - Google Analytics