Lisp风格的编程语言Clojure入门
1 引言
在众多的编程语言中,不少开发人员熟悉Java、C#、PHP等。但是很早以前,也有一些小众的语言,比如Lisp语言,它是一种适用于符号处理和自动推理的编程语言,内部使用表结构来表达非数值计算。而Clojure语言是在JVM上实现的Lisp风格的语言,语法与Lisp类似,且可以和Java语言进行互操作,因此,在任何安装了Java 虚拟机的设备上,我们都可以利用Clojure来发挥Lisp的强大功能,特别是符号处理方面。
2 快速环境搭建
学习一门语言,最可靠的就是官网。Clojure的入门可以通过官网进行学习:https://www.clojure.org/guides/getting_started 。其中有不同的操作系统上的环境搭建指导。这里基于Window 10操作系统,可以基于源码进行编译并运行REPL界面进行代码运行。假设计算机上已经正确安装了JDK 8和Maven,且配置了Git工具。下面可以用命令行运行如下命令下载源码并用Maven打包:
git clone https://github.com/clojure/clojure.git
cd clojure
mvn -Plocal -Dmaven.test.skip=true package
编译成功后,界面如下:
而启动本地的REPL 界面则可以用如下命令:
java -jar clojure.jar
启动的交互界面如下:
3 语法入门
前面提到,Clojure语言和Lisp语言类似,它和Java语言的语法差异比较大。因此初学者会感觉语法有点奇怪。其实,不同的语言其思考的方式不同,面向对象的编程语言转化到函数式编程的一个不适应在于,二者的编程思维模式不同。Clojure语言是一个列表化的编程语言,代码放于圆括号中,中间用空格进行分割。下面给出Clojure语言的基本语法示例:
user=> ; 这是注释
user=> (ns mynamespace) ; ns 命名空间
nil
mynamespace=> (str "Hello" " " "World") ; str 创建字符串
"Hello World"
mynamespace=> (+ 1 2) ; 1 + 2
3
mynamespace=> (* 1 2)
2
mynamespace=> (/ 1 2)
1/2
mynamespace=> (- 1 2)
-1
mynamespace=> (= 1 2)
false
mynamespace=> (not (= 1 2))
true
mynamespace=> (* 3 (+ 1 2))
9
mynamespace=> (class 2.6)
java.lang.Double
mynamespace=> (class "hello")
java.lang.String
mynamespace=> (class false)
java.lang.Boolean
mynamespace=> '(* 2 3)
(* 2 3)
mynamespace=> eval '(* 2 3)
#object[clojure.core$eval 0x5733f295 "clojure.core$eval@5733f295"]
(* 2 3)
mynamespace=> (eval '(* 2 3))
6
mynamespace=> (coll? [1 2 3 4 5])
true
mynamespace=> (seq? [1 2 3 4 5])
false
mynamespace=> (seq? '(1 2 3 4 5))
true
mynamespace=> (range 7)
(0 1 2 3 4 5 6)
mynamespace=> (cons 7 [1 2 3])
(7 1 2 3)
mynamespace=> (conj [1 2 3] 7)
[1 2 3 7]
mynamespace=> (concat [1 2] [3 4])
(1 2 3 4)
mynamespace=> (reduce * (range 5))
0
mynamespace=> (reduce * (map inc (range 5)))
120
mynamespace=> (def pi 3.14)
#'mynamespace/pi
mynamespace=> (* mynamespace/pi 2)
6.28
Clojure语言中的代码,要放于()中用于执行,另外就是它的操作符或者方法在前,参数在后。支持语句的嵌套定义。下面给出函数基本语法,示例如下:
mynamespace=> (defn hello [name]
(str "Hello," name))
#'mynamespace/hello
mynamespace=> (hello "demo")
"Hello,demo"
mynamespace=> (def say #(str "Say " %1))
#'mynamespace/say
mynamespace=> (mynamespace/say "Coljure")
"Say Coljure"
mynamespace=>
mynamespace=> (defn say
([] "Hello Clojure")
([msg] "Hello " msg)
)
#'mynamespace/say
mynamespace=> (say)
"Hello Clojure"
mynamespace=> (say "Clojure 2")
"Clojure 2"
mynamespace=> (defn sum [& args]
(str "sum=" (reduce + args))
)
#'mynamespace/sum
mynamespace=> (sum 1 2)
"sum=3"
mynamespace=> (sum 1 2 3)
"sum=6"
mynamespace=> (defn myfunc [n]
"函数示例:(myfunc 7)"
(cond
(< n 0) "<0"
(> n 7) ">7"
:else "[0-7]"))
#'mynamespace/myfunc
mynamespace=> (myfunc 7)
"[0-7]"
关于其他的语法可参考 :https://www.clojure.org/guides/learn/syntax
- 点赞
- 收藏
- 关注作者
评论(0)