最近在看storm的源码,就学习分享下clojure语法。

阅读目录:

  1. 概述
  2. 变量
  3. 运算符
  4. 流程控制
  5. 总结

概述

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#articleHeader0

clojure基础入门(一)的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  3. .NET正则表达式基础入门

    这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...

  4. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  5. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  6. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  7. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  8. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  9. RobotFramework - 基础入门

    Robot Framework Wiki HomePage Robot Framework User Guide Robot Framework documentation Robot Framewo ...

随机推荐

  1. 使用PowerShell来修改文件访问,创建,修改时间属性

    Function Set-FileTimeStamps { Param ( [Parameter(mandatory=$true)] [string[]]$path, [datetime]$date ...

  2. SqlLite 基本操作

    1.数据类型 ●  SQLite将数据划分为以下⼏几种存储类型: ●  integer : 整型值 ●  real : 浮点值 ●  text : ⽂文本字符串 ●  blob : ⼆二进制数据(⽐比 ...

  3. WebRTC音频预处理单元APM的整体编译及使用

    正文 行的gnu静态库链接路径是针对NDK版本 r8d 的,如读者版本不匹配,请自行找到 libgnustl_static.a 静态库的路径进行替换. 3)本示例并不打算编译 WebRTC 的测试工程 ...

  4. locky勒索样本分析

    前段时间收到locky样本,分析之后遂做一个分析. 样本如下所示,一般locky勒索的先决条件是一个js的脚本,脚本经过了复杂的混淆,主要用于下载该样本文件并运行,. 解密 样本本身进行了保护,通过i ...

  5. 多线程之信号量(By C++)

    信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量. 所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行.你会怎么做,所有就需要给出一个流程1结束 ...

  6. Linux usual cmd

    日常工作时常需要用到,在此备份一下: <1> top命令 第一行:当前系统时间为23:31:59,系统已经运行了127天又19小时47分钟,当前系统只要一个用户即root,load ave ...

  7. Anaular指令详解

    目录:directive()   restrict   replace   template   templateUrl  scope  transclude   ng-transclude   co ...

  8. 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)

    Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...

  9. Tsinsen A1493 城市规划(DP + CDQ分治 + NTT)

    题目 Source http://www.tsinsen.com/A1493 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在 ...

  10. 1.2 控制器 view 的创建和加载

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书”       加载优先顺序: 1.用系统的loadView方法创建控制器的视图 2.如果指定 ...