vlambda博客
学习文章列表

Clojure从入门到放弃

Clojure

什么是 Clojure?小白说:"A Lisp dialet on JVM."。真是一言以蔽之啊,是不是足够简单?酷!

安装 Clojure

大部分人学习新的东西,基本上都死在了配置环境上。此言非虚!没有一个好的环境,很容易挫败自信心。

Windows 上安装

安装比较简单,省略。

Linux 上安装

安装也比较简单,省略。不过还是简单的介绍一下吧。

yum install -y rlwrap
curl -O https://download.clojure.org/install/linux-install-1.10.1.492.sh
chmod +x linux-install-1.10.1.492.sh
sudo ./linux-install-1.10.1.492.sh

# 安装完成会有如下输出
Installing libs into /usr/local/lib/clojure
Installing clojure and clj into /usr/local/bin
Installing man pages into /usr/local/share/man/man1
Removing download
Use clj -h for help.

简单使用:

root@ip-192-168-2-56 ~]# clj
Clojure 1.10.1
user=> (+ 1 2) # 在此输入语句
3
user=> (def a "hello world") # 定义一个变量
#'user/a
user=> a
"hello world"
user=> (defn sum [number] # 定义一个函数
(apply + number))
#'user/sum
user=> (sum [1 2 3 4 5])
15

好了,入门教程就介绍到这里,是不是很简单?酷!

lein

lein 这个工具类似 JavaScript 生态中的 npm  yarn 工具,但功能不止这么多,还有点脚手架的功能。

lein 安装

基本命令使用:

lein new [TEMPLATE] NAME # generate a new project skeleton

lein test [TESTS] # run the tests in the TESTS namespaces, or all tests

lein repl # launch an interactive REPL session

lein run -m my.namespace # run the -main function of a namespace

lein uberjar # package the project and dependencies as standalone jar

lein deploy clojars # publish the project to Clojars as a library

一个简单的应用

我们可以使用 lein 来创建应用,

lein new app my-stuff
# app 指定创建的是一个应用,而不是一个库
[root@ip-192-168-2-56 my-stuff]# pwd
/root/github/my-stuff
[root@ip-192-168-2-56 my-stuff]# tree -L 2
.
├── CHANGELOG.md
├── doc
│   └── intro.md
├── LICENSE
├── pom.xml
├── project.clj
├── README.md
├── resources
├── src
│   └── my_stuff
├── target
│   ├── classes
│   ├── my-stuff-0.1.0-SNAPSHOT.jar
│   └── stale
└── test
└── my_stuff

9 directories, 7 files

 project.clj 里设置我们的依赖(很像 Java 中的 pom.xml 文件)。文件内容看起来如下:

(defproject my-stuff "0.1.0-SNAPSHOT"
:description "A simple Clojure project"
:url "http://localhost/hello"
:license {:name "Eclipse Public License"
:url "https://www.eclipse.org/legal/epl-2.0/"}
:dependencies [[org.clojure/clojure "1.10.0"]
[clj-http "3.10.0"]]
:profiles {:dev {:dependencies [[ring/ring-devel "1.4.0"]]}}
:main my-stuff.core
:aot [my-stuff.core])

简单介绍一下依赖项都是做什么的:

  • clj-http 一个 HTTP 客户端工具

  • ring 一个 WEB 框架,类似 Python 中的 Django Flask

再看看 main 函数,位于:src/my_stuff/core.clj 文件中,内容如下:

(ns my-stuff.core
(:gen-class))

(defn -main [& args]
(println "Welcome to my project! These are your args:" args))

这样就可以了,我们打包一下,可以打成 jar 包。

lein uberjar
Compiling my-stuff.core
Compiling my-stuff.core
Created /root/github/my-stuff/target/my-stuff-0.1.0-SNAPSHOT.jar
Created /root/github/my-stuff/target/my-stuff-0.1.0-SNAPSHOT-standalone.jar # 这个 jar 包可以单独执行的

运行一下:

java -jar target/my-stuff-0.1.0-SNAPSHOT-standalone.jar
Welcome to my project! These are your args: nil

java -jar target/my-stuff-0.1.0-SNAPSHOT-standalone.jar Hello Clojure!
Welcome to my project! These are your args: (Hello Clojure!)

参考文档

  1. 入门教程

  2. clj-http 安装