clojure基础入门(一)
最近在看storm的源码,就学习分享下clojure语法。
阅读目录:
概述
clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以方便的互相调用,这样开发的程序可以很好的结合java和clojure的优点(storm),这跟Net中C#和F#的角色一样。
安装java1.6以上的JDK,下载地址。
下载clojure的环境 包,下载地址。
解压后用命令行进入到clojure目录下,输入下面命令进入REPL命令行交互界面:
java -cp clojure-1.7..jar clojure.main

欢迎进入clojure的世界。

变量
Clojure中的变量可以def关键字来声明:

clojure数据类型是弱类型,对应java中的object,然后通过变量名直接调用。
类似c#中代码:
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后范围,类似C#中的i++。
(inc ) ;=>
减量:
(dec ) ;=>
求商函数:
(quot ) ;=>
求余函数:
(quot ) ;=>
小于(<):
(< ) ;=>true
小于等于 (<=):
(<= ) ;true
大于(>):
(> ) ;=>true
大于等于 (>=) :
(<= ) ;true
等号 =
(= ) ; => true
(= ) ; => false
(= "") ;=> false
同样的把前置运算符理解为函数,后面为参数。
函数
clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数。 定义函数用defn,跟定义变量的def类似:
(defn Get [] "Hello World") ;=>"Hello World"
下面定义了get函数,中括号为函数的参数,输出Hello World字符串。加参数后,再次调用需要传入值,如果不传会报异常。

下面在函数内部使用a函数参数,如果想要拼接的话,可以在内部使用str函数,用它返回的值当成Get函数的参数:

多个参数表示形式:[arg1,arg2]
流程控制
判断if

这里有三层嵌套,首先(= 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里面的每个操作被实现成以下三种形式:
- 函数(function) 文中以defn定义的。
- 宏(macro) Clojure中几乎所有的函数和宏都是用Clojure代码实现的,关于宏后面再说。
- special form 文中出现的if就是,其他还包括catch,def,do,dot (‘.’),finally,fn,if,let,loop,monitor-enter,monitor-exit,new,quote,recur,set!,throw,try,var。
博客园的代码高亮不支持Clojure。
[0] http://clojure.org/ [1] http://xumingming.sinaapp.com/302/ [2] http://huangz.iteye.com/blog/1325228 [3] http://segmentfault.com/a/1190000000414279#articleHeader0clojure基础入门(一)的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- 「译」JUnit 5 系列:基础入门
原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...
- .NET正则表达式基础入门
这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...
- 从零3D基础入门XNA 4.0(2)——模型和BasicEffect
[题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- RobotFramework - 基础入门
Robot Framework Wiki HomePage Robot Framework User Guide Robot Framework documentation Robot Framewo ...
随机推荐
- vim简明教程
在shell中新建一个文件 # vim a.txt vim有三种模式:一般模式.插入模式.底行模式 三种工作模式 1.命令模式 移动光标 hjkl yy 复制 nyy 从光标向下复制n行 0 移动光标 ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
- Python Web 方向(一)
Python Web 方向(一) --------Django站点创建 文章地址:http://www.cnblogs.com/likeli/p/5821744.html Python版本:2.7 推 ...
- 设计模式 之 原型模式(ProtoType)
什么时原型模式 或 原型模式的定义: 用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的特点: 1),它是面向接口编程, 2),原型模式的新对象是对原型实例的一个克隆 ...
- 【java.lang.UnsupportedClassVersionError】版本不一致出错
这种错误的全部报错信息: java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported ...
- WebGL入门教程(五)-webgl纹理
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 WebGL入门教程(四)-webgl颜色 这里就需要用到 ...
- 车销宝无线开单PDA 一款互联网+POS神器 无缝与电脑数据同步 无线POS开单解决方案
1.无线POS开单解决方案是基于后台系统开发的一套系统,它实现了采购入库退货.销售出库退货.盘点调拨等功能. 2.系统通过(WIFI.GPRS.GSM.蓝牙)实时后台库存.客户.商品.价格跟踪等信息, ...
- XV Open Cup named after E.V. Pankratiev. GP of Tatarstan
A. Survival Route 留坑. B. Dispersed parentheses $f[i][j][k]$表示长度为$i$,未匹配的左括号数为$j$,最多的未匹配左括号数为$k$的方案数. ...
- 简述TCP连接的建立与释放(三次握手、四次挥手)
在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...
- bzoj1927最小费用最大流
其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→ =_=你TM逗我 刚要删突然感觉dinic的模 ...