转载

快学Clojure

Why? 为了更好的了解并发和函数式语言.

简介

  • Clojure 是一套现代的Lisp语言的动态语言版(Lisp方言)
  • 最开始Clojure运行在JVM上, 所有有很好的扩平台特性.
  • 函数式语言的 不变性 使它们很好的支持并发

环境部署

  1. 下载 IntelliJ IDEA
  2. Preference -> Plugins -> Browse Repositories -> 查找 Cursive
  3. 重启IDEA

使用 Leiningen 作为Clojure的命令行构建工具

$ brew update $ brew install leiningen # 查看lein的命令 $ lein help # 进行Clojure的REPL $ lein repl # 使用Clojure创建一个可运行的Clojure的项目 $ lein new app hello-world # 进入创建的项目, 然后执行 $ lein run # 在项目内对代码打包 $ lein uberjar # 使用java运行jar包 $ java -jar target/uberjar/hello-world-0.1.0-SNAPSHOT-standalone.jar 

语法

每学习都应该根本当前语法对应以前学习过的语法

Clojure的代码是由一个个form组成的, form的语法如下:

; operator未操作符(函数或者加减乘除等), 后面均为操作数 (operator operand1 operand2 ...operandn) 

变量

; def定义一个变量 user=> (def a1) #'user/a user=> (println a) 1 

基本类型和操作

Clojure基本数据类型包括 Number, String, Map, Keyword, Vector, List, Set , 均为 immutable , 对基本数据类型的更改都会在生成一个新的拷贝

(def a 1) ; 整数 (def s "hello") ; 字符串 :a ; keyword (def v [123]) ; Vector数组 (conj v 4) ; 向Vector/List/Set增加数据 (list 124) ;List链表 #{1 2 3}; 使用#{}创建一个Set 
  • if语句
(ifcondition-form then-form optional-else-form) 

切记: Cloju使用nil和false表示逻辑假, 其他所有值的均为真

函数

; 简单的函数调用 (+123) 
  • 函数定义使用 (defn 函数名 函数注释 参数列表, 函数体)
  • 函数体可以由多个form构成, Clojure将最后一个form的执行结果作为返回值
user=> (defn hello"just a test method"[sentence] (println sentence)) #'user/hello user=> (hello"andrew liu") andrew liu 
  • 函数重载
user=> (defn func-overload  #_=> ([] (str"no arg"))  #_=> ([name] (str"arg "name))  #_=> ([name_a name_b] (str"arg "name_a" "name_b))) #'user/func-overload user=> (func-overload) "no arg" user=> (func-overload"andrew") "arg andrew" user=> (func-overload"andrew""liu") "arg andrew liu" 
  • 匿名函数
user=> (def no_name (fn[name](str"hello "name))) #'user/no_name user=> (no_name "andrew") "hello andrew" 

  • 通过defmacro来定义macro

并发

  • Future 可以让我们在另一个线程去执行任务,它是异步执行的,所以调用了future之后会立即返回

未完待续

参考链接

Clojure repl Connection Closed

原文  http://andrewliu.in/2016/03/19/快学Clojure/
正文到此结束
Loading...