几分钟内学习Clojure
来源:互联网 发布:星夜床垫 知乎 编辑:程序博客网 时间:2024/04/27 14:05
此处获取源码: test.clj
Clojure是JVM上的一个LISP语言变种。它比Common Lisp更强调纯函数式编程,但提供了一些STM工具以处理它所引入的状态问题。
这个组合使并行处理更加简单,并且通常是自动的。
(你需要Clojure 1.2或以上版本。)
- ; 分号作为注释的开始
- ; Clojure 用一种把元素用括号括起来的像列表一样的方式来书写,元素之间用空格隔开
- ; clojure 解释器会把第一个元素当做是函数或者宏调用,其他的都作为参数
- ; 下面这个函数用于设置当前的命名空间
- (ns test)
- ; 更多基本的例子:
- ; str 函数会用它所有的参数创造一个字符串
- (str "Hello" " " "World") ; => "Hello World"
- ; 数学运算很直观,不过是前缀表达式
- (+ 1 1) ; => 2
- (- 2 1) ; => 1
- (* 1 2) ; => 2
- (/ 2 1) ; => 2
- ; 相等比较使用 “=”符号
- (= 1 1) ; => true
- (= 2 1) ; => false
- ; 你也不必担心逻辑运算
- (not true) ; => false
- ; 嵌套方式正如你预料的那样
- (+ 1 (- 3 2)) ; = 1 + (3 - 2) => 2
- ; 类型系统
- ;;;;;;;;;;;;;
- ; Clojure 使用java对象类型来表示 布尔值、字符串和数字
- ; 使用 `class`函数来检测它们.
- (class 1) ; 整形字面值默认是java中的Long类型
- (class 1.); 浮点字面值对应着java中的Double类型
- (class ""); 字符串总是用双引号括起来,并且对应着java中的Sring类型
- (class false) ;布尔值对应着java中的Boolean类型
- (class nil); null值被称为 nil(英语含义:无、零点)
- ; 如果你想创建一列数据字面值, 使用一个单引号 ' 来防表达式被解析执行
- '(+ 1 2) ; => (+ 1 2) ;这里没有返回3
- ; (上面表达式和(quote (+ 1 2)) 等价,不过更简洁
- ; 你可以运算一个引用列表
- (eval '(+ 1 2)) ; => 3
- ; 集合和序列
- ;;;;;;;;;;;;;;;;;;;
- ; 向量和列表也是java类哦!!
- (class [1 2 3]); => clojure.lang.PersistentVector
- (class '(1 2 3)); => clojure.lang.PersistentList
- ;书写一个列表形如(1 2 3)一样简单, 但是我们不得不把它“引”(前面加个单引号)起来
- ;这样就能防止解释器把它当做一个函数来解析
- ;另外,(list 1 2 3) 和 '(1 2 3) 等价
- ;列表和向量都是集合:
- (coll? '(1 2 3)) ; => true
- (coll? [1 2 3]) ; => true
- ; 只有列表是序列.(序列是有顺序的)
- (seq? '(1 2 3)) ; => true
- (seq? [1 2 3]) ; => false
- ; 序列是列表一种逻辑上的接口,可以懒加载.
- ; "懒" 意味着可以定义无穷序列,就像下面一样:
- (range 4) ; => (0 1 2 3)
- (range) ; => (0 1 2 3 4 ...) (一个无穷序列)
- (take 4 (range)) ; (0 1 2 3)
- ; 使用cons 来追加一个元素到列表或者向量的头部
- (cons 4 [1 2 3]) ; => (4 1 2 3)
- (cons 4 '(1 2 3)) ; => (4 1 2 3)
- ; 使用conj追加一个元素到列表的头部,或者向量的尾部,
- (conj [1 2 3] 4) ; => [1 2 3 4]
- (conj '(1 2 3) 4) ; => (4 1 2 3)
- ; 使用concat来连接列表和向量
- (concat [1 2] '(3 4)) ; => (1 2 3 4)
- ; 使用filter, map 来进行列表计算
- (map inc [1 2 3]) ; => (2 3 4)
- (filter even? [1 2 3]) ; => (2)
- ; 使用reduce 来进行化繁为简 (map/reduce 思想就来自于lisp)
- (reduce + [1 2 3 4])
- ; = (+ (+ (+ 1 2) 3) 4)
- ; => 10
- ; Reduce 可以使用一个初始值
- (reduce conj [] '(3 2 1))
- ; = (conj (conj (conj [] 3) 2) 1)
- ; => [3 2 1]
- ; 函数
- ;;;;;;;;;;;;;;;;;;;;;
- ; 使用fn来创建一个函数。所有的函数都有返回值,就是它的最后一个表达式
- (fn [] "Hello World") ; => fn
- ; (你需要额外的括号去调用它)
- ((fn [] "Hello World")) ; => "Hello World"
原文链接:http://www.cxypub.com/portal.php?mod=view&aid=43
- 几分钟内学习Clojure
- 几分钟内学习 Clojure
- 几分钟内学习 Clojure
- 几分钟内学习 Clojure
- 几分钟内学习 Clojure
- 几分钟内学习Clojure
- Y分钟学clojure
- 百度几分钟内完成闪电裁员
- 学习clojure
- Clojure 学习
- Clojure 学习
- 几分钟内可以部署的搜索引擎-searchbox
- Flash Builder 4: 几分钟内创建twitter搜索UI
- 这道题你能在几分钟内完成?
- 如何在几分钟内部署Hadoop集群
- 电脑开机后几分钟内蓝屏原因之一
- clojure学习资源
- 开始学习 Clojure 语言
- DOS栏目【0】
- Java 的内存管理机制是怎样的?
- Java 排序
- CGAffineTransform这个结构体到底怎么理解? 每个值都标示什么含义呢?
- 我拒绝参加你们的技术面试
- 几分钟内学习Clojure
- Monkey实例测试(MarshalChen)
- linux下ip协议(V4)的实现(二)
- 《Qt编程的艺术》——9.1 QtSql模块的结构
- ipvsadm 安装配置
- 一道经典的C++结构体的题目
- apache的rewrite模块实例操作
- Poj 2774两个字符串的最长公共子串长度
- Linux内核网络部分文章集合