目录
当前位置: 首页 > 文档资料 > Clojure 入门教程 >

3 Clojure概述

优质
小牛编辑
128浏览
2023-12-01

Clojure概述

Clojure是一个动态类型的,运行在JVM(JDK5.0以上),并且可以和java代码互操作的函数式语言。这个语言的主要目标之一是使得编写一个有多个线程并发访问数据的程序变得简单。

Clojure的发音和单词closure是一样的。Clojure之父是这样解释Clojure名字来历的

“我想把这就几个元素包含在里面: C (C#), L (Lisp) and J (Java). 所以我想到了 Clojure, 而且从这个名字还能想到closure;它的域名又没有被占用;而且对于搜索引擎来说也是个很不错的关键词,所以就有了它了.”

很快Clojure就会移植到.NET平台上了. ClojureCLR是一个运行在Microsoft的CLR的Clojure实现. 在我写这个入门教程的时候ClojureCLR已经处于alpha阶段了.

在2011年7月, ClojureScript项目开始了,这个项目把Clojure代码编译成Javascript代码:看这里 https://github.com/clojure/clojurescript .

Clojure是一个开源语言, licence: Eclipse Public License v 1.0 (EPL). This is a very liberal license. 关于EPL的更多信息看这里: http://www.eclipse.org/legal/eplfaq.php .

运行在JVM上面使得Clojure代码具有可移植性,稳定性,可靠的性能以及安全性。同时也使得我们的Clojure代码可以访问丰富的已经存在的java类库:文件 I/O, 多线程, 数据库操作, GUI编程, web应用等等等等.

Clojure里面的每个操作被实现成以下三种形式的一种: 函数(function), 宏(macro)或者special form. 几乎所有的函数和宏都是用Clojure代码实现的,它们的主要区别我们会在后面解释。Special forms不是用clojure代码实现的,而且被clojure的编译器识别出来. special forms的个数是很少的, 而且现在也不能再实现新的special forms了. 它们包括: catch , def , do , dot (‘.’), finally , fn , if , let , loop , monitor-enter , monitor-exit , new , quote , recur , set! , throw , tryvar .

Clojure提供了很多函数来操作序列(sequence), 而序列是集合的逻辑视图。很多东西可以被看作序列:Java集合, Clojure的集合, 字符串, 流, 文件系统结构以及XML树. 从已经存在的clojure集合来创建新的集合的效率是非常高的,因为这里使用了 persistent data structures 的技术(这对于clojure在数据不可更改的情况下,同时要保持代码的高效率是非常重要的)。

Clojure提供三种方法来安全地共享可修改的数据。所有三种方法的实现方式都是持有一个可以开遍的引用指向一个不可改变的数据。Refs通过使用 Software Transactional Memory (STM)来提供对于多块共享数据的同步访问。Atoms提供对于单个共享数据的同步访问。Agents提供对于单个共享数据的异步访问。这个我们会在 “引用类型”一节详细讨论。

Clojure是 Lisp) 的一个方言. 但是Clojure对于传统的Lisp有所发展。比如, 传统Lisp使用 car 来获取链表里面的第一个数据。而Clojure使用 first。有关更多Clojure和Lisp的不同看这里: http://clojure.org/lisps .

Lisp的语法很多人很喜欢,很多人很讨厌, 主要因为它大量的使用圆括号以及前置表达式. 如果你不喜欢这些,那么你要考虑一下是不是要学习Clojure了 。许多文件编辑器以及IDE会高亮显示匹配的圆括号, 所以你不用担心需要去人肉数有没有多加一个左括号,少写一个右括号. 同时Clojure的代码还要比java代码简洁. 一个典型的java方法调用是这样的:

methodName(arg1, arg2, arg3);

而Clojure的方法调用是这样的:

(function-name arg1 arg2 arg3)

左括号被移到了最前面;逗号和分号不需要了. 我们称这种语法叫: “form”. 这种风格是简单而又美丽:Lisp里面所有东西都是这种风格的.要注意的是clojure里面的命名规范是小写单词,如果是多个单词,那么通过中横线连接。

定义函数也比java里面简洁。Clojure里面的 println 会在它的每个参数之间加一个空格。如果这个不是你想要的,那么你可以把参数传给 str ,然后再传给 println .

// Java
public void hello(String name) {
    System.out.println("Hello, " + name);
}
; Clojure
(defn hello [name]
  (println "Hello," name))

Clojure里面大量之用了延迟计算. 这使得只有在我们需要函数结果的时候才去调用它. “懒惰序列” 是一种集合,我们之后在需要的时候才会计算这个集合理解面的元素. 只使得创建无限集合非常高效.

对Clojure代码的处理分为三个阶段:读入期,编译期以及运行期。在读入期,读入期会读取clojure源代码并且把代码转变成数据结构,基本上来说就是一个包含列表的列表的列表。。。。在编译期,这些数据结构被转化成java的bytecode。在运行期这些java bytecode被执行。函数只有在运行期才会执行。而宏在编译期就被展开成实际对应的代码了。

Clojure代码很难理解么?想想每次你看到java代码里面那些复杂语法比如: if , for , 以及匿名内部类, 你需要停一下来想想它们到底是什么意思(不是那么的直观),同时如果想要做一个高效的Java工程师,我们有一些工具可以利用来使得我们的代码更容易理解。同样的道理,Clojure也有类似的工具使得我们可以更高效的读懂clojure代码。比如: let , apply , map , filter , reduce 以及匿名函数 … 所有这些我们会在后面介绍.

最后更新:

类似资料

  • 概述 国际化和本地化的目的就是让一个网站应用能做到根据用户语种和指定格式的不同而提供不同的内容。 Django 对文本翻译, 日期、时间和数字的格式化,以及时区提供了完善的支持。 实际上,Django做了两件事: 由开发者和模板作者指定应用的哪些部分应该翻译,或是根据本地语种和文化进行相应的格式化。 根据用户的偏好设置,使用钩子将web应用本地化。 很显然,翻译取决于用户所选语言,而格式化通常取决

  • 虽然Django 满满的便捷性让Web 开发人员活得轻松一些,但是如果不能轻松地部署你的网站,这些工具还是没有什么用处。Django 起初,易于部署就是一个主要的目标。有许多优秀的方法可以轻松地来部署Django: 如何使用WSGI 部署 部署的检查清单 FastCGI 的支持已经废弃并将在Django 1.9 中删除。 如何使用FastCGI、SCGI 和AJP 部署Django 如果你是部署D

  • 本书概述 进程的概念大家都很熟悉,但你是否能准确说出僵尸进程的含义呢?还有 COW(Copy On Write)、Flock(File Lock)、Epoll 和 Namespace 的概念又是否了解过呢? 本书汇集了进程方方面面的基础知识,加上编程实例,保证阅读后能自如地回答以上问题,在项目开发中对进程的优化也有更深的理解。 本书架构 本书按循序渐进的方式介绍进程的基础概念和拓展知识,主要涵盖以

  • Docker在1.12.0和以上版本中增加了swarm模式。通过swarm模式管理的Docker Engines集群称之为“Swarm”。并可以通过Docker CLI来创建Swarm,在Swarm中部署应用服务,以及管理Swarm。 功能特点 在Docker Engines中集成了集群管理功能:通过Docker CLI可以创建一个用来发布应用services的swarm,而不需要安装其他任何额外

  • 这是 Elasticsearch 官方的 PHP 客户端。我们把 Elasticsearch-PHP 设计成低级客户端(低级设计模式),使用时不会偏离 REST API 的用法。 客户端所有方法几乎都与 REST API 对应,而且也与其他编程语言的客户端(如 ruby, python 等)方法结构相似。我们希望这种对应方式可以方便开发者更加容易上手客户端,且以最小的代价快速从一种编程语言转换到另

  • 特点 为什么用 Groovy?