Clojure学习笔记(一)——介绍、安装和语法
什么是Clojure
Clojure是一种动态的、强类型的、寄居在JVM上的语言。
Clojure的特性:
- 函数式编程基础,包括一套性能可以和典型可变数据结构媲美的持久性数据结构
- 由JVM提供的成熟的、高效的运行时环境:所以Clojure可以使用Java类库,反之Clojure库也可以被Java使用
- 跟JVM/Java的互操作能力使得很多架构、运维方面的需求可以得到满足:Clojure代码可以像Java代码一样被打包,然后部署到任何Java应用可以部署的地方
- 一套提供并发、并行语义的机制:Clojure的应用类型强制我们把对象的状态和对象的标识区分开(这是个天才的思想,参见[1][2]),对于多线程的支持使得我们不用手动加锁,解锁也能编写多线程代码
- 是一种Lisp方言,因此提供了非常灵活、强大的元编程能力:Clojure保留了Lisp的最好的特性,去掉了Lisp方言的缺陷。
安装Clojure
因为Clojure需要运行在JVM上所以需要JRE。然后可以在http://clojure.org/community/downloads下载Clojure的代码。有了这些就可以运行Clojure的REPL了。
运行REPL
从命令行运行运行REPL的方式:1. 进入下载的Clojure目录;2.运行java -cp clojure-1.8.0.jar clojure.main,如果会看到如下,则成功:
为了以后运行方便可以创建一个shell脚本cljREPL.sh,内容如下:
#!/bin/sh
cd /home/namenode/Code/workspace/clojure-1.8.
java -cp clojure-1.8..jar clojure.main
然后,修改执行权限:
chmod +x cljREPL.sh
然后创建软链接:
sudo ln -s /home/namenode/Code/workspace/clojure-1.8./cljREPL.sh /bin/cljREPL
这样在终端直接输入cljREPL就可以直接运行Clojure的REPL了
安装Clojure命令工具
在Ubuntu下可以直接用apt-get安装Clojure。
sudo apt-get install clojure1.
测试,创建文件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的功能是把程序员写的文本格式的代码转换成Clojure数据结构。Reader的所有操作是由一个叫read的函数定义的,这个函数从一个字符流里读入代码的文本形式,产生这个文本所对应的数据结构。Clojure的REPL就是使用Reader来读入文本代码的, reader的作用其实可以看做是反序列化的过程。与read和read-string对应的两个函数是pr和pr-str,这两个函数是序列化的过程。
所有Clojure的数据结构和值序列化之前都是既对人可读,又对机器可读
标量字面量
字符串
和Java等语言一样 “Hello World”
而且Clojure天然支持多行
布尔值
Clojure中用true和false表示布尔值
nil
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形式
空格和逗号
在Reader眼里,逗号就是空格
集合字面量
命名空间
所有的Clojure代码都是在一个命名空间中被定义和求值的。命名空间可以禅城Ruby和Python的module,Java的package。
Clojure中的一种引用类型var是一种可修改的内存地址,从而可以保存任何值,在var被定义的命名空间里,var和一个符号相关联,然后我们就可以通过这个符号来使用这个var,从而得到这个var的值。
在Clojure中var是用def来定义的。如:
在当前命名空间user中定义了一个名叫x的var
当前的命名空间始终绑定到*ns*上
符号求值
阻止求值:quote
阻止求值也可以用单引号表示
代码块:do
do会依次传入进来所有的表达式,并且把最后一个表达式的结果作为返回值
定义Var:def
本地绑定:let
所有本地绑定都是不可变的;let的绑定数组在编译期间在编译器间可以对通用集合进行解构,利用解构,可以大大简化从绑定数据中抽取想要的数据的操作。
解构:let
很多Clojure函数都接受顺序性数据结构和map作为参数或返回值,而且接受或返回抽象数据类型。这使函数在调用Clojure类库时,不需要额外的代码去对接具体数据结构的实现,也就不需要一些glue code来做类型转换之类的事情,可保持代码简单
定义函数:fn
函数是把参数值绑定到参数上,在执行
defn
defn基于fn,封装了def和fn的功能,定义一个具有名的函数
判断:if,when,cond
循环:loop和recur
与Java的互操作:.和new
异常处理:try和throw
状态修改:set!
锁的原语:monitor-enter和monitor-exit
参考
- http://ifeve.com/stm-1/
- Dr. Alan Kay, 《on the Meaning of “Object-Oriented Programming”》, http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
- Chas Emerick, Brian Carper, Christophe Crand,《Clojure编程》
Clojure学习笔记(一)——介绍、安装和语法的更多相关文章
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- openresty 学习笔记一:环境安装
openresty 学习笔记一:环境安装 openresty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭 ...
- PHP学习笔记----IIS7下安装配置php环境
原文:PHP学习笔记----IIS7下安装配置php环境 Php如何安装 Php版本的选择 Php在windows下的(php5.4.7)有两种版本: VC9 x86 Non Thread Safe ...
- 树莓派学习笔记——apt方式安装opencv
0.前言 本文介绍怎样在树莓派中通过apt方式安装opencv.并通过一个简单的样例说明怎样使用opencv. 相比于源码方式安装opencv,通过apt方式安装过程步骤简单些,消耗的时间也少 ...
- 学习笔记 - Sass的安装与使用手册
最近因为工作需要,自学了Sass.现在将学习笔记整理在这里,供大家参考. 1. Sass的安装 Sass的编辑器安装方法有很多,大致能分为两种:应用程序(application)和命令行界面(comm ...
- 学习笔记--Grunt、安装、图文详解
学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- Git学习笔记--历史与安装(一)
声明:今天起学习Git,第一篇学习笔记主要借鉴廖雪峰先生的个人博客,以及自己的实践所得. “本教程只会让你成为Git用户,不会让你成为Git专家”——引自廖雪峰博客. 一.Git简介 Git是目前世界 ...
- Linux 学习笔记 2 Centos 安装与网络的配置以及VI编辑器的使用
前言 当然,还是觉得Centos 在众多的Linux 发行版中,还是很有地位的,好多的服务器大多沿用的都是一代的Centos 因为它开源(这是废话)而且稳定,这才是服务器沿用的最重要的一项指标. 镜像 ...
随机推荐
- ionic实现手机检测app是否安装,未安装则下载安装包,已安装则打开app(未实现iOS平台)
插件需求(上cordova官网下载): com.lampa.startapp cordova-plugin-appavailability cordova-plugin-inappbrowser 代码 ...
- ionic2安装时报错
Installing npm packages...Error with start undefinedError Initializing app: There was an error with ...
- GitLab + Jenkins + Docker + Kubernetes。
目前方案是GitLab + Jenkins + Docker + Kubernetes. 方案的工作流程如下:首先,开发人员提交代码代码提交:随后,GitLab 会自动触发Jenkins job,Je ...
- 微软良心之作——Visual Studio Code 开源免费跨平台代码编辑器
微软良心之作——Visual Studio Code 开源免费跨平台代码编辑器 在 Build 2015 大会上,微软除了发布了 Microsoft Edge 浏览器和新的 Windows 10 预览 ...
- IE10,IE11下cookie无法写入问题
asp.net 4.0的程序,发布后,测试在ie6,ie7,ie8,ie9下均可以正常登录,但是在ie10,ie11下就是无法保存cookie,排查了一下是否ie10,ie11是否存在设置问题发下并不 ...
- Maven聚合与继承的实例讲解(一)
概述 在javaweb高速发展的今天,我们软件设计人员往往会用很多种方式对软件划分模块,目的就是为了能有清晰的设计和低耦合性的,高重用性的软件.Maven有很好的依赖管理系统(Dependency M ...
- spring基础整理
spring基础教程:https://www.tutorialspoint.com/spring/spring_overview.htm 注入实例 <bean id="" c ...
- AJAX-----06XMLHttpRequest对象的处理返回的XML类型数据
我们首先要确保XML文件是否正常执行 如果访问时候报类似 Parse error: syntax error, unexpected 'version' (T_STRING 这样的错误,我们则需要 ...
- POJ - 1107 W's Cipher
POJ - 1107 W's Cipher Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u De ...
- 修改yv12像素值
YV12内存布局 1 unsigned char *pY = (unsigned char *)pBuf; unsigned char *pV = pY + nWidth * nHeight; uns ...