最近在看storm的源码,就学习分享下clojure语法。html
阅读目录:java
clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java能够方便的互相调用,这样开发的程序能够很好的结合java和clojure的优势(storm),这跟Net中C#和F#的角色同样。编程
安装java1.6以上的JDK,下载地址。
下载clojure的环境 包,下载地址。
解压后用命令行进入到clojure目录下,输入下面命令进入REPL命令行交互界面: c#
java -cp clojure-1.7.0.jar clojure.main
欢迎进入clojure的世界。 segmentfault
Clojure中的变量能够def关键字来声明: oracle
clojure数据类型是弱类型,对应java中的object,而后经过变量名直接调用。app
相似c#中代码: ide
object greet = "Good Morning"; Console.WriteLine(greet);
Clojure语法是把代码元素用小括号形式括起来,以空格来分割元素,使其像填充列表同样来编写代码。函数式编程
(str "Hello World!")
函数式编程中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数,如上"hello world"是被当成参数传入str函数进行输出。函数
相似C#代码:
Console.WriteLine("Hello World!");
一个变量能够重复赋值,也能够是不一样类型:
def能够把函数赋值给一个变量,函数变量不能直接调用,须要加上括号:
相似c#代码:
Action func = () => { Console.WriteLine("Hello World"); }; func();
clojure使用前置运算符,分号(;)表示后面跟的是注释。
加减乘除:
(+ 1 1) ; => 2 (- 2 1) ; => 1 (* 1 2) ; => 2 (/ 2 1) ; => 2
增量,接受一个数值加1后范围,相似C#中的i++。
(inc 5) ;=>6
减量:
(dec 5) ;=>4
求商函数:
(quot 5 2) ;=>2
求余函数:
(quot 5 2) ;=>1
小于(<):
(< 5 6) ;=>true
小于等于 (<=):
(<= 5 5) ;true
大于(>):
(> 8 5) ;=>true
大于等于 (>=) :
(<= 5 5) ;true
等号 =
(= 1 1) ; => true (= 2 1) ; => false (= 1 "1") ;=> false
一样的把前置运算符理解为函数,后面为参数。
clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数。 定义函数用defn,跟定义变量的def相似:
(defn Get [] "Hello World") ;=>"Hello World"
下面定义了get函数,中括号为函数的参数,输出Hello World字符串。加参数后,再次调用须要传入值,若是不传会报异常。
下面在函数内部使用a函数参数,若是想要拼接的话,能够在内部使用str函数,用它返回的值当成Get函数的参数:
多个参数表示形式:[arg1,arg2]
这里有三层嵌套,首先(= age 18)来判断返回是否等于18,做为if判断该返回哪一个字符串的依据,再根据if肯定的字符串做为函数的返回值。 注意if是否是函数或宏,而是叫作special form(特殊形式),并且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示的值做为函数的返回值。
谓词函数是一个判断式,一个返回bool值的函数或者仿函数,用来测试条件是否成立。
与或非(and or not):
clojure中(lisp习惯)有个规定:对于判断功能的函数,函数名后面都有一个“?”号。因此只要看到后面带问号的函数名,就知道这必定是一个判断语句。
user=> (fn? quot) ;判断quot是否是一个函数true
user=> (fn? 1) ;判断1是否是一个函数 false
测试一个对象的类型的谓词:class?,coll?,decimal?,delay?,float?,fn?,instance?,integer?,isa?,keyword?,list?,macro?,map?,number?,seq?,set?,string?,vector?。
测试两个值之间关系的谓词有:<,<=,=,not=,==,>,>=,compare,distinct? , identical?。
测试逻辑关系的谓词有:and,or,not,true?,false?,nil?。
测试数字的谓词有:even?,neg?,odd?,pos?,zero?。
Clojure里面的每一个操做被实现成如下三种形式:
博客园的代码高亮不支持Clojure。
[0] http://clojure.org/ [1] http://xumingming.sinaapp.com/302/ [2] http://huangz.iteye.com/blog/1325228 [3] http://segmentfault.com/a/1190000000414279#articleHeader0