Clojure 中的vector是一种有序、带索引、不可变的集合,可以包含零个或多个值。也就是说,向量一旦创建,就不能再修改。对向量进行操作的函数会返回一个新的向量,而原来的向量保持不变。向量中的值可以有不同的类型。向量可以这样定义:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
可以使用下标从向量中取出元素。Clojure 的向量下标从零开始,也就是说第一个元素的下标始终是 0:
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
原来的向量保持不变:
numbers
;;=> [2 3 5]
要记住更新后的值,需要把它传递下去,或者用一个 var 把它保存起来:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
你是一位热衷观鸟的爱好者,会记录过去七天里有多少只鸟来过你的花园。
你有六个任务,全都与来过你花园的鸟的数量有关。
为了方便比较,你总是把上周的计数副本放在手边,上周的计数是:0、2、5、3、7、8 和 4。创建一个包含上周计数的向量:
last-week
;;=> [0 2 5 3 7 8 4]
实现today函数,返回今天有多少只鸟来过你的花园。鸟的计数按天排序,第一个元素是最早那天的计数,最后一个元素是今天的计数。
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
实现inc-bird函数,让今天的计数自增:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
实现day-without-birds?谓词函数:如果有一天没有任何鸟来过花园,就返回true;否则返回false:
(day-without-birds? birds-per-day)
;;=> true
实现n-days-count函数,返回从这周开始起来过你花园的鸟的数量,但把计数限制在从这周开始算起的指定天数内。
(n-days-count birds-per-day 4)
;;=> 14
有些日子比其他日子更忙。忙碌的一天是指有 5 只或更多鸟来过你花园的日子。
实现busy-days函数,返回忙碌天数的数量:
(busy-days birds-per-day)
;;=> 2
过去一年里,你发现有些星期都呈现出同样奇特的规律:鸟的数量在 1 和 0 之间交替。实现odd-week?函数:如果这周的鸟数量规律符合这个奇特规律,就返回true:
(odd-week? [1 0 1 0 1 0 1])
;;=> true