标量字面量
标量字面量是Clojure中非集合类型值的语法形式。很多字面量你在其他语言比如Java、Ruby、Python中都已经接触过,而另外一些则是Clojure所独有的并且有它独特的语义。
字符串
Clojure中的字符串就是Java的字符串(也就是说,是java.lang.String的实例),而且表现形式也是一模一样,用双引号括起来:
"hello world"
;="hello world"
备注:以后都用”;=”来表示代码输出结果。
Clojure的字符串天然支持多行,不用使用任何其他的语法,比如:
"mutiline stirngs
are very handy"
;="mutiline strings\nare very handy"
布尔值
Clojure中用true和false来表示布尔值。
nil
Clojure中的nil和Java中的null,Ruby中的nil是类似的,在Clojure的条件判断中,nil是逻辑false。
字符
Clojure中的字符字面量是通过反斜杠加字符来表示的:
(class \c)
;=java.lang.Charater
关键字
关键值求值成它们自身,经常被当作访问器来获取它们对应的值,比如下面的map和record:
(def person {:name "Sandra Cruz"
:city "Porland, Me"})
(:city person)
;="Portland, Me"
从语法上来说,关键字始终以冒号开头,它可以包含任意非空的字符,如果关键字里面包含 /,表示这个关键字是命名空间限定的,而如果一个关键字以两个冒号( : : )开头,那么表示当前命名空间的关键字,如果一个关键字以两个冒号开头,同时又包含了 / 的话,比如 : :alias/kw,那么表示是某个特定命名空间里面的关键字。
(def pizza {:name "Ramunto's"
:lacation "Claremont, NH"
::location "43.3734,-72.3365"})
pizza
;={:name "Ramunto's", :location "Claremont, NH", :user/location "43.3734,-72.3365"}
(:user/location pizza)
;="43.3734,-72.3365"
这使得同一个应用的不同模块,同一个组织的不同部门可以安全地、自由地使用关键字,而不必为了避免名字的冲突而设计复杂的领域或者一些复杂的命名规范。
关键字是一种命名类型,之所以这么说是因为它们有自己内在的名字,(可以通过name函数访问),以及一个可选的命名空间(通过namespace函数访问),比如:
(name :user/location)
;="location"
(namespace :user/location)
;="user"
(namespace :location)
;=nil
正则表达式
Clojure里面把以#开头的字符串当作正则表达式:
(class #"(p|h)ail")
;=java.util.regex.Pattern
注释
Clojure支持两种注释:
- 以分号 ( ; ) 开头的单行注释,在这一行中,分号后面的所有内容都会忽略。
- 形式级别的注释 #_宏。这个宏告诉reader忽略下一个Clojure形式。
(read-string "(+ 1 2 #_(* 2 2) 8)")
;=(+ 1 2 8)
空格和逗号
在形式之间,函数的参数之间、数据结构的元素之间都没有使用逗号分割的:
(defn silly-adder
[x y]
(+ x y))
在reader眼里,逗号就是空格,下面这段代码和上面的是一样的:
(defn silly-adder
[x,y]
(+,x,y))
集合字面量
reader给Clojure中常用的一些数据结构提供了对应的语法:
'(a b :name 12.5) ;; list
['a 'b :name 12.5] ;; vector
{:name "Chas" :age 31} ;; map
#{1 2 3} ;; set
由于Clojure中使用列表表示函数调用,所以当要表示列表数据结构的时候要在前面加一个单引号,以防止列表被求值成一个函数调用。