BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Clojure给JVM带来了STM、LISP

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 胡键 关注 0 他的粉丝 发布于 2009年2月2日. 估计阅读时间: 8 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

Clojure是Lisp语言家庭中的新近成员,运行于Java平台之上。它于2007年面世,并已获得了广泛关注。原因之一在于Clojure解决并发问题的方法是建立于软件事务性内存(STM)之上的。

Stuart Halloway《Programming Clojure》(由Pragmatic Programmers出版社出版)一书的作者,该书目前尚处于beta版阶段。我们和Stuart就Clojure、STM、工具等内容进行了交谈。

InfoQ:Clojure使用STM来实现并发;你能对STM进行一番简明扼要的介绍吗?

STM是一个更大故事的一部分:针对可变状态的明确API(explicit APIs for mutable state)。通过将代码分成纯函数层和可变层,你可以得到2个极大的好处:
* 你的纯函数代码更容易测试和重用
* 你可以选择符合你的并发性和伸缩性需要的明确可变API(explicit mutable API)。Clojure为不同状况提供了4种不同的API:refs和STM、agents、vars和atoms。此外,你总能向下再深入一层,使用Java并发API。

InfoQ:另一类对Clojure感兴趣的是已经熟悉Lisp的程序员;在尝试使用Clojure时,他们有什么需要注意的?

我对Lisp使用者的建议是“一开始要有耐心。”Clojure是自由的Lisp,不存在和其他Lisp向后兼容的问题。这意味着在实际过程中有很多东西是不同的。一旦你在Clojure上花了些时间,你可能就会同意Rich的设计决策,认为其动机是非常不错的。

Clojure网站已经有了一份文档来说明它和很多其他Lisp的区别。Clojure的创造者Rich Hickey提供了一些幻灯片(PDF链接)来向Java开发者讲解Clojure,以及反过来从Lisp使用者的角度来讲解Clojure

InfoQ:对于Java使用者,或更普遍的,使用OOP的开发者来说,有什么习惯是他们在使用Clojure时需要抛弃的?

不象其他新的VM热门语言,Clojure*不是*面向对象的。这一开始可能会把人给吓住:“没有对象,我该怎么来设计一个系统?”
但是Clojure*的确*提供了很多你想从OO中得到的东西:
* 封装(通过名字空间、私有定义和闭包)
* 强大的多态(multimethods)
* 函数重用比继承更胜一筹。(函数和不可变状态组合比继承层次更优。)
Clojure和众多OO语言的区别在于:OO语言提供的是套餐,选择有限;而Clojure提供的则是散餐,可照单随意选择。

InfoQ:对于Lisp的初学者,你有什么资源可推荐的(当然,除了你的书之外)?

Clojure和很多好思想联系紧密。除了《Programming Clojure》之外,我会推荐
* Seibel的《Practical Common Lisp》很适合想尽快提高Lisp的人
* Graham的《On Lisp》有助于了解Lisp的宏
* Goetz等人所写的《Java Concurrency in Practice》讨论了并发性
* O'Sullivan等人所写的《Real World Haskell》可帮助了解函数编程
* Abelson和Sussman的《Structure and Interpretation of Computer Programs》,因为每个人都应该读一读它

附注:这些书大多数同时还是可在线免费获得的:《Practical Common Lisp》《On Lisp》《Real World Haskell》《SICP》

InfoQ:Clojure开发者应该避免哪些旧的Lisp模式/实践?(如,不要到处都使用list,取而代之尽量优先使用Clojure的数据结构,如maps、vectors等?)。

你真是说到了这个问题的点子上。在Clojure中,list主要是用于代码。至于数据,则要根据不同情况选择合适的结构,拥抱sequences库。不要害怕直接调用Java API。

InfoQ:Clojure的库生态系统怎样?

对于任一已知需求(Web开发、数据库存取、测试、BDD)都有3到4个即将面世的Clojure库。这本书中“Clojure in the Wild”一章对它们进行了简要的介绍,并进一步提供了使用test-is测试框架和Compojure的例子。

在Clojure的邮件列表中,Rich Hickey最近要求Clojure库的维护者报告他们正在开发的库。在GitHub中的Clojure语言分类下可找到大量的Clojure项目。

InfoQ:你愿意看到一个多平台的Clojure(不只是针对于Java平台的Clojure)出现吗?

不愿意。Clojure和Java的紧密集成是其动力的关键。当然,我很高兴看到与.NET平台有关的实用Lisp——但它不应该是Clojure。

InfoQ:你使用什么工具来进行Clojure编程?

我使用Emacs,偶尔再加上SLIME。但我已经是一名Emacs使用者了,因而上述选择显而易见。另外,还存在针对于vi、Eclipse、IDEA和NetBeans的插件。

支持Clojure的一些IDE/编辑器的例子是:clojure-dev(Eclipse)、clojure-intellij-plugin(IntelliJ)、enclojure(NetBeans)。Gorilla(VIM),它类似SLIME(Emacs)(Bill Clementson已经写了一篇在Emacs和SLIME中配置Clojure环境的指南)

由于很多这些工具都需要完成类似的工作,已经出现了关于在这些工具的一个公共后台之上进行合作的呼声。一种选择是采用类似SLIME和Gorilla的做法,即运行一个Clojure实例,然后通过查询它来完成文档查看(Clojure符号将它们的文档字符串作为元数据携带),代码查看、名字空间浏览等工作。

InfoQ:你现在会在复杂的商业项目中使用Clojure吗?

如果身处一个敏捷团队,有好的测试套件,我目前会毫不犹豫的将Clojure用于产品环境之中。

InfoQ最近报道了一个将Clojure应用投入生产环境的例子。(InfoQ上更多关于Clojure的内容)。

你会考虑Clojure吗?Clojure的哪方面最让你感兴趣——它的Lisp血统、STM或其他?

查看英文原文Clojure Brings STM, LISP to the JVM

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

神奇的拼音输入法 by 高 德翔

多态类固醇???

Re: 神奇的拼音输入法 by 胡 键

已更正。原文是:polymorphism on steroids,即“打了类固醇的多态”,后引申为“强大的多态”。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT