在Clojure中有多种方式组织你的数据集,分别是列表(list)、向量(vector)、映射(map)和集合(set)1。
先大致看一下每一个的格式2:
- 列表
'(a b c) - 向量
[1 2 3] - 映射
{:a 1 :b 2} - 集合
#{:a :b :c}
- 列表的相应操作3
创建列表:
(ns clojure.examples.example
(:gen-class))
(defn example []
(println (list 1 2 3 4)))
(example)
使用list将一组数据转换为list数据,输出为(1 2 3 4),在书写list的时候应该在其前面加上’,因为括号是Clojure的语言单位,一个括号里的代表一个语句,不加引号会使得系统认为list的第一个元素为函数,后续元素为其操作数据。
引文中给出了列表的常见操作,例如取出首个元素等3:
(first '(1 2 3 4 5 6))
;;-> 1
- 向量的相应操作4
创建向量:
(ns clojure.examples.example
(:require [clojure.set :as set])
(:gen-class))
(defn example []
(println (vector 1 2 3)))
(example)
使用vector创建一个向量,输出为:[1 2 3],列表中的一些操作符,同样可以在向量中使用:
(first [1 2 3])
;;-> 1
跟列表不同,向量中你可以快速地通过索引访问到元素:
(nth [1 2 3] 0)
;;-> 1
(nth [1 2 3] 2)
;;-> 3
还有一个函数是last,返回最后一个元素:
(last [:a :b :c])
;;-> :c
其他操作符可在引文中查看4
- 映射的相应操作5
(ns clojure.examples.example
(:gen-class))
(defn example []
(def demokeys (hash-map "z" "1" "b" "2" "a" "3"))
(println demokeys))
(example)
映射又叫map,通过hash-map来构建一个映射,结果为:{z 1 b 2 a 3},同我们接触的其他语言一样,映射是按键值对存储的,我们也可以写成{z 1, b 2, a 3},其中逗号被视为是空格,映射为了可读性保留了逗号,符合惯用法。
可以通过相应的操作符来操作map。例如:
(get {:a 1 :b 2 :c 3} :b "not found")
;;-> 2
通过键来获取到值,并给出默认值,默认值不是必须的,可以省略。
- 集合的相应操作6
创建集合:
(ns clojure.examples.example
(:gen-class))
(defn example []
(println (set '(1 1 2 2))))
(example)
使用set将列表转换为集合的操作,输出结果为#{1,2},集合是不重复元素的,具体的集合的函数操作,在引文中详细给出6。
Living Clojure(中文版):中国电力出版社 ↩︎
Clojure语言三:容器:https://blog.csdn.net/csfreebird/article/details/8444070 ↩︎
列表的相应操作:https://www.w3cschool.cn/clojure/clojure_lists.html ↩︎ ↩︎
向量的相应操作:https://www.w3cschool.cn/clojure/clojure_vectors.html ↩︎ ↩︎
映射的相应操作:https://www.w3cschool.cn/clojure/clojure_maps.html ↩︎
集合的相应操作:https://www.w3cschool.cn/clojure/clojure_sets.html ↩︎ ↩︎