[TOC] ## 向量 * 向量是一组通过整数索引的数据 * 与表相比,向量更加紧凑且存取时间更短 ### 字面值 ``` #(1 2 3) ; 整数向量 '#(1 2 3) ;效果同上 '#(a 0 #\a) ; 由符号、整数和字符构成的向量 ``` ### 向量函数 ``` (vector-ref vector k) 返回向量vector的索引为k的元素 (vector->list vector) 将vector转换为表 (list->vector list) 将list转换为向量 (vector-length vector) 返回向量vector的长度 (make-vector k) 返回有k个元素的向量 (make-vector k fill) 所有的元素都会被初始化为fill ``` eg ``` (vector-length #(1 2 3)) ;3 (vector-ref #(2 4 5) 1) ;4 类似数组通过索引取值 (make-vector 2 ) ;(vector 0 0) (vector 1 1) ;(vector 1 1) ``` 一个对向量中元素求和的函数 ``` //定义 (define (vector-add v1 v2) (let ((lenv1 (vector-length v1)) (lenv2 (vector-length v2))) (if (= lenv1 lenv2) (let ((v (make-vector lenv1))) (let loop ((i 0)) (if (= i lenv1) v (begin (vector-set! v i (+ (vector-ref v1 i) (vector-ref v2 i))) (loop (+ 1 i)))))) (error "different dimensions.")))) //调用 (vector-add #(1 2 3) #(4 5 6)) ;(vector 5 7 9) ``` ## 结构体 这些结构体本质上来说都是向量 ``` define-struct 进行实例化 make-entry 进行初始化 ``` 实例一: 创建结构体 ``` (define-struct entry (name zip phone)) (define phonebook (make-entry 'PeterLee 15270 '606-7771)) (entry-name phonebook) => 'PeterLee (entry-zip phonebook) => 15270 (entry-phone phonebook) => '606-7771 (entry? phonebook) => #true ``` 实例二:修改并返回结构体 ``` ;; 创建结构体 (define-struct star (last first instrument sales)) ;;实例化 (define a-star (make-star 'Abba 'John 'vocls 10000)) ;; sales 添加 2000 (define (increment-sales foo-start) (make-star (star-last foo-start) (star-first foo-start) (star-instrument foo-start) (+ (star-sales foo-start) 2000) )) ;; 调用 (increment-sales a-star ) ``` ## cons 表 ### Cons单元和表 (类key-vlaue ) ``` `() ; '() empty ; '() ``` ![51635343-052D-46FB-9CC7-36D39316E578.png](http://yanxuan.nosdn.127.net/c106c52e332b4233ef80d93406973b24.png) :-: cons(表)的图解 ### 复杂数据类型 ``` (define demo (cons 'hello (cons 3 (cons true empty)))) demo ;'(hello 3 #t) (cons? demo) ; #t // 使用 first 与 rest (first demo) ;'hello (rest demo) ;'(3 #t) (first (rest (cons 10 (cons 22 empty)))) ;=(first (cons 22 empty)) ;=22 ``` ### 判断cons 中是否存在某个元素 ``` ; 描述: 判断表中是否有 'doll 元素 ; 测试 ; emprt ->false ; '(w dll)->false ; '(w doll a)->true (define (contains-doll? a-list-of-symbols) (cond [(empty? a-list-of-symbols ) false] [(cons? a-list-of-symbols) (cond [(symbol=? (first a-list-of-symbols ) 'doll) true] [else (contains-doll? (rest a-list-of-symbols)) ])] [else 'contains-doll? "param type is eror"])) (define I (cons 'w (cons 'doll empty))) (contains-doll? I) ;#t ``` ### 结构体存入表中 通过名称获取商品图片 ``` ; 设置物品的结构体 (define-struct goods (name price pictrue)) ; 通过物品名称获取物品照片 (define (shop-symbol? name list-struct) (cond [(empty? list-struct) false] [(symbol=? name (goods-name (first list-struct))) (goods-pictrue (first list-struct))] [else (shop-symbol? name (rest list-struct)) ] )) ;初始化商店物品 (define list-goods (cons (make-goods 'robot 29.95 'robot-p) (cons (make-goods 'doll 11.95 'doll-p) (cons (make-goods 'rocket 19.95 'rocket-p) empty)))) (shop-symbol? 'robot list-goods ) ;'robot-p (shop-symbol? 'robot empty) ;#flase ``` ### 表中套入表 ``` (define list-cons (cons 'a (cons 'b empty))) (define list-cons-1 (cons 'c (cons list-cons empty))) list-cons-1 ; (list 'c (list 'a 'b)) ``` ## list 1. 理解list表达式的一种简单方法是将它当作若干cons的简写 ``` (list 1 2)=(cons 1 (cons 2 empty) ``` 2. 用 list 表示时,可以 省略 list 用 `'`代替 ``` (list 1 2 3) = '(1 2 3) (list 'a 'b 'c) = (list 'a 'b 'c) ;(list 'a 'b 'c) ``` 例子 ``` (list) ;Value: () (list 1 2) ;Value 27: (1 2) '(1 2 3 ) ;(list 1 2 3) (first (list 1 2 3)) ; 1 (rest (list 1 2 3)) ;(list 2 3) (append (list 'a 'b 'c ) (list 'd 'e)) ;(list 'a 'b 'c 'd 'e) ``` ## car(同 first)函数和cdr(同rest)函数 ``` (car '(1 2 3 4)) ;Value: 1 等价于 first (cdr '(1 2 3 4)) ;Value 18: (2 3 4) 等价于 rest ```