Lisp风格的编程语言Clojure入门

举报
jackwangcumt 发表于 2021/08/10 14:42:42 2021/08/10
【摘要】 在众多的编程语言中,不少开发人员熟悉Java、C#、PHP等。但是很早以前,也有一些小众的语言,比如Lisp语言,它是一种适用于符号处理和自动推理的编程语言,内部使用表结构来表达非数值计算。而Clojure语言是在JVM上实现的Lisp风格的语言,语法与Lisp类似,且可以和Java语言进行互操作

 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

    编译成功后,界面如下:

1.jpg
      而启动本地的REPL 界面则可以用如下命令:

java -jar clojure.jar

     启动的交互界面如下:
2.jpg

 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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。