向量 / 结构体 / cons / list / string?等检查类型
最后更新于:2022-04-02 02:05:54
[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
```
';