七周七语言之Clojure代码学习

; 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值