Clojure是一种动态的、强类型的、寄居在JVM上的语言。java
Clojure的特性:node
由于Clojure须要运行在JVM上因此须要JRE。而后能够在http://clojure.org/community/downloads下载Clojure的代码。有了这些就能够运行Clojure的REPL了。程序员
从命令行运行运行REPL的方式:1. 进入下载的Clojure目录;2.运行java -cp clojure-1.8.0.jar clojure.main,若是会看到以下,则成功:正则表达式
为了之后运行方即可以建立一个shell脚本cljREPL.sh,内容以下:shell
#!/bin/sh cd /home/namenode/Code/workspace/clojure-1.8.0 java -cp clojure-1.8.0.jar clojure.main
而后,修改执行权限:编程
chmod +x cljREPL.sh
而后建立软连接:数组
sudo ln -s /home/namenode/Code/workspace/clojure-1.8.0/cljREPL.sh /bin/cljREPL
这样在终端直接输入cljREPL就能够直接运行Clojure的REPL了数据结构
在Ubuntu下能够直接用apt-get安装Clojure。多线程
sudo apt-get install clojure1.6
测试,建立文件balance.clj(例子来自《Java虚拟机并发编程》)架构
(def balance(ref 0)) (println "Balance is " @balance) (dosync (ref-set balance 100)) (println "Balance is now " @balance)
运行:clojure balance.clj则会打印下图的结果
Clojure、Java、Python和Ruby中的函数调用语法比较
Clojure是由Clojure自身的数据结果:原子值(字符串、数字等)和集合的字面量来表示。这种特征就叫“同像性”,或者称为“代码即数据”。
Clojure没有定义一种将会别转换成AST(Abstract Sytax Tree,抽象语法树)的语法,Clojure代码是直接用表示抽象语法树的Clojure数据结构来写的。
Clojure使用数据来表示语言代码的特征使得Clojure代码能够很容易地用来编写和转换其余Clojure代码。这是宏(Macro)的基础,Clojure中的元程序编程工具要比C语言中提供的那种宏以及其余文本预处理器要强劲的多。
Clojure reader的功能是把程序员写的文本格式的代码转换成Clojure数据结构。Reader的全部操做是由一个叫read的函数定义的,这个函数从一个字符流里读入代码的文本形式,产生这个文本所对应的数据结构。Clojure的REPL就是使用Reader来读入文本代码的, reader的做用其实能够看作是反序列化的过程。与read和read-string对应的两个函数是pr和pr-str,这两个函数是序列化的过程。
全部Clojure的数据结构和值序列化以前都是既对人可读,又对机器可读
和Java等语言同样 “Hello World”
并且Clojure自然支持多行
Clojure中用true和false表示布尔值
Clojure中的nil和Java中的null是相似的,在判断中nil是逻辑的false
字符字面量是经过反斜杠加字符表示的:
对于Unicode编码和octal编码,可使用对用前缀:
同时对于一些特殊字符也有对应的常量:
\space \newline \formfeed \return \backspace \tab
关键字始终是以冒号开头,它能够包含任意非空字符。若是关键字里面包含/,表示这个关键字是命名空间限定的。若是关键字是以两个冒号(::)开头的,那么表示是当前命名空间的关键字。若是关键字以两个冒号开头,同时又包含了/,如::alias/kw,那么表示某个特定命名空间里面的关键字。这个设计与XML里面的命名空间实体的用法和动机是同样的,也就是为了让同一个名字在不一样的命名空间里有不一样的值和语义。
符号也是一种标识符,符号的值是它所表明的Clojure运行时里面的那个值,这个值可使var所持有的值、Java类、本地引用等。
十六进制:0xff 八进制:040(以0开头) 任意进制:BrN(N表示数字,B表示进制) 有理数:用比例数表示
以#开头,不须要对反斜杠转义
在Reader眼里,逗号就是空格
全部的Clojure代码都是在一个命名空间中被定义和求值的。命名空间能够禅城Ruby和Python的module,Java的package。
Clojure中的一种引用类型var是一种可修改的内存地址,从而能够保存任何值,在var被定义的命名空间里,var和一个符号相关联,而后咱们就能够经过这个符号来使用这个var,从而获得这个var的值。
在Clojure中var是用def来定义的。如:
在当前命名空间user中定义了一个名叫x的var
当前的命名空间始终绑定到*ns*上
阻止求值也能够用单引号表示
do会依次传入进来全部的表达式,而且把最后一个表达式的结果做为返回值
全部本地绑定都是不可变的;let的绑定数组在编译期间在编译器间能够对通用集合进行解构,利用解构,能够大大简化从绑定数据中抽取想要的数据的操做。
不少Clojure函数都接受顺序性数据结构和map做为参数或返回值,并且接受或返回抽象数据类型。这使函数在调用Clojure类库时,不须要额外的代码去对接具体数据结构的实现,也就不须要一些glue code来作类型转换之类的事情,可保持代码简单
函数是把参数值绑定到参数上,在执行
defn基于fn,封装了def和fn的功能,定义一个具备名的函数