七周七语言之Clojure代码学习

来源:互联网 发布:网络美术培训 编辑:程序博客网 时间:2024/05/17 20:31
; Hello world(println "Hello world!")
实际操作:
(使用javax.swing.JOptionPane/showMessageDialog nil "Hello World")
实际效果:
; 实现unless(defmacro unless [test body] (list 'if (list 'not test) body)) ;创建宏(macroexpand '(unless condition body)) ;展开宏
实际操作:

; 递归(defn size [v]        (if (empty? v)                   0                   (inc (size    (rest    v)))))(size [1 2 3])
实际操作:
; 使用协议和记录来实现一个罗盘功能(defprotocol Compass  ; 定义了协议  (direction [c])     ; 声明direction方法  (left [c])  (right [c]))(def direction [:north :east :south :west])  ; 实现direction方法; 基本方向north/east/south/west对应数字分别为0/1/2/3(defn turn  [base amount]  (rem (+ base amount) (count directions)))  ; 取余数; 定义一个记录(defrecord SimpleCompass [bearing]  Compass  (direction [_] (directions bearing))  (left [_] (SimpleCompass. (turn bearing 3)))  (right [_] (SimpleCompass. (turn bearing 1)))  Object  (toString [this] (str "[" (direction this) "]")))(def c (SimpleCompass. 0))(left c) ;返回一个新罗盘c ; 原来的罗盘没有变化(:bearing c)
实际操作:

; 引用和事务内存(def movie (ref "Star Wars"))  ; 创建引用movie(dosync  (alter movie str ": The Empire Strikes Back"))(deref movie)(dosync (ref-set movie "Star Wars: The Revenge of the Sith"))@movie
实际操作:
  
优势:
1.优秀的Lisp方言:Clojure是一个优秀的Lisp方言,通过语法上减少括号的使用改进了Lisp的可读性;有着Lisp良好的生态系统,并且建立在JVM之上是的Clojure可以充分受益于Java语言中大量的库集合。
2.并发支持:Clojure通过STM(software transactional memory软件事务内存)实现并发,通过检测状态改变是否发生在(受适当保护的)函数内来保护开发者,若不在事务里,就不能修改状态。
3.Java集成:与Java有很好的集成,可以使用Clojure类型可以参与到Java应用中。
4.延迟计算:Clojure增加了延迟计算特性。
5.数据及代码:程序就是列表,像其他Lisp方言一样,可以把数据当做代码。


不足:
1.前缀表达法:由于代码表示为列表形式即前缀表达法,与其他通用语言语法相差较大,不易于转换。
2.可读性:数据即代码的另一个成本就是多的令人压抑的括号,不易于书写和阅读。
3.学习曲线:学习曲线较陡,诸如延迟序列、函数式编程、宏扩展、事务内存以及精密复杂的方法,所有这些都是需要时间才能掌握的概念。
4.受限的Lisp:由于在JVM上,Clojure限制了尾递归优化,程序员必须使用可怕的recur语法。
5.亲和度:Clojure对开发者提出了极大的要求,它包含了太多的抽象工具和概念,有时让人不堪重负。
0 0