函数式风格、对并发的强力支持以及干净的Java互操作,给Clojure提供了极其强大的力量。
形式Clojure具有同像性,lojure代码本身,是由Clojure数据构成的。
当运行一段Clojure程序,作为Clojure组成部分的读取器(reader),读入那些被称为“形式”的程序文本块,然后将它们翻译为Clojure的数据结构。接下来,Clojure编译并执行这些数据结构。
Clojure的形式
使用数值类型数值字面量本身就是形式。数字会简单的对其自身进行求值。
42
-> 42
创建了一个包含数字1、2和3的向量。
[1 2 3]
-> [1 2 3]
列表是一种形式。一个列表可以“仅仅只是数据”,但也可以用于调用函数。
创建一个列表,它的第1项是一个Clojure函数+号。
(+ 1 2)
-> 3
Clojure对这个列表进行求值的时候,是把它当作了一次调用。
当函数名是一个单词时,前缀表示法是相当常见的。
(concat [1 2] [3 4])
-> (1 2 3 4)
Clojure只不过是像对待所有其他函数一样,把数学运算符也简单地放到起始位置罢了。
采用前缀表示法还有一个实际好处,可以很容易将其扩展为任意数量的参数。
(+ 1 2 3)
-> 6
甚至在没有参数的这种退化情况(degenerate case)下,它仍然能按照期望的那样,返回一个零。这非常有利于消除为处理边界条件而产生的特例逻辑。
-> 0
(- 10 5)
-> 5
(* 3 10 10)
-> 300
(> 5 2)
-> true
(>= 5 5)
-> true
(< 5 2)
-> false
(= 5 2)
-> false
除法为比例类型。
(/ 22 7)
-> 22/7
Clojure内建了一个比例(Ratio)类型。
(class (/ 22 7))
-> clojure.lang.Ratio
十进制除法,就得用浮点数的字面量来作为被除数。
(/ 22.0 7)
-> 3.142857142857143
只需要整数结果,那你可以使用quot和rem函数来获取整型的商和余数。
(quot 22 7)
-> 3
(rem 22 7)
-> 1
当需要任意精度的浮点运算时,在数字后面追加一个大写的M,就可以创建一个BigDecimal类型的字面量。
(+ 1 (/ 0.00001 1000000000000000000))
-> 1.0
(+ 1 (/ 0.00001M 1000000000000000000))
-> 1.00000000000000000000001M
为了得到任意精度的整数,可以通过在数字后面追加一个大写的 N,来创建一个BigInt类型的字面量。
(* 1000N 1000 1000 1000 1000 1000 1000)
-> 1000000000000000000000N
注意,算式中只需要一个BigInt字面量就够了,因为它会传染到整个计算过程当中。