clojure基础入门(一)

最近在看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.0.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 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]

流程控制

判断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
时间: 2024-10-11 07:19:01

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

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——2.3.12 Date &amp; Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的

Android基础入门教程——2.1 View与ViewGroup的概念

Android基础入门教程--2.1 View与ViewGroup的概念 标签(空格分隔): Android基础入门教程 本节引言: 告别了第一章,迎来第二章--Android中的UI(User Interface)组件的详解, 而本节我们要学习的是所有控件的父类View和ViewGroup类!突发奇想,直接翻译官方文档对 这两个东西的介绍吧,对了,天朝原因,google上不去,Android developer上不去,我们可以 改hosts或者用vpn代理,当然也可以像笔者一样使用国内的API

DAX基础入门 – 30分钟从SQL到DAX — PowerBI 利器

看到漂漂亮亮的PowerBI报表,手痒痒怎么办?! 有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?! 有没有想得到某个值想不出来DAX怎么写而直跳脚!? 看完这篇文章,你会恍然大悟,捂脸偷笑.呼呼呼~ 前言: 这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等. 注:此文不涉及到Filter Context(筛选上下文)的介绍. 正文: 对于对SQL有一定了解的人来说,咋看DAX,怎么都不习惯. 但是,如果理解以下几个后,

Linux 基础入门----推荐课程

Linux 基础入门课程:https://www.shiyanlou.com/courses/1 很好的一门Linux基础课,精炼.简洁!推荐! 课程内容: 第1节 Linux 系统简介 https://www.shiyanlou.com/courses/1/labs/1/document 第2节 基本概念及操作 https://www.shiyanlou.com/courses/1/labs/2/document 第3节 用户及文件权限管理 https://www.shiyanlou.com/

从零基础入门JavaScript(1)

从零基础入门JavaScript(1) 1.1  Javascript的简史 1995年的时候   由网景公司开发的,当时的名字叫livescript    为了推广自己的livescript,搭了java顺风车,改名为javascript 与此同时,     微软因此在自身的浏览器里,也推出了自己的脚本语言 jscript 1997年时候,  由ECMA(欧洲计算机制造商协会)出面,推出了一套javascript的规范,Ecmascript ,规范提出js由三部分组成 JS的组成: ECMAS

saltstack之基础入门系列文章简介

使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文章主要讲述了saltstack的安装.远程执行.配置管理.数据系统以及jinjia模板等知识点,从第七篇往后的文章是一些使用saltstack的案例,包括系统初始化,rpm包以及源码安装等. 博客中saltstack系列的文章,适合初学者从零开始学习直到逐渐熟练使用.文章具有一定的连贯性,如果没有任