if / and / cond 条件分支
最后更新于:2022-04-02 02:05:59
[TOC]
## 分支
### if表达式
格式
`(if predicate then_value else_value)
`
```
(define (demo num)
(if (> num 10)
(- num 1)
(+ num 1)))
```
```
(demo 15) ;14
(demo 5) ;6
```
#### begin 用法
如果你的代码体中有多条 S-表达式
```
(define (demo n)
(if (> n 15)
(begin
(print 1)
(print 2)
)
(print 3)))
(demo 16) ;12
(demo 10) ;3
```
### and
and具有任意个数的参数如果某一参数为#f,那么它就返回`#f`,
```
(and #f 0) ;Value: ()
(and 1 2 3) ;Value: 3
(and 1 2 3 #f) ;Value: ()
```
### or
返回第一个不是 `#f` 的值
```
(or #f 0) ;Value: 0
(or 1 2 3) ;Value: 1
(or #f 1 2 3) ;Value: 1
(or #f #f #f) ;Value: ()
```
### cond表达式 (类似 if-elseif)
格式
```
(cond
(predicate_1 clauses_1)
(predicate_2 clauses_2)
......
(predicate_n clauses_n)
(else clauses_else))
```
demo
```
(define (fee age)
(cond
((or (<= age 3) (>= age 65)) 0)
((<= 4 age 6) 0.5)
((<= 7 age 12) 1.0)
((<= 13 age 15) 1.5)
((<= 16 age 18) 1.8)
(else 2.0)))
//也可以使用 中括号
(define (fee age)
(cond
[(or (<= age 3) (>= age 65)) 0]
[(<= 4 age 6) 0.5)]
[(<= 7 age 12) 1.0)]
[(<= 13 age 15) 1.5]
[(<= 16 age 18) 1.8)]
[else 2.0]))
```
### eq?
该函数比较两个对象的地址
```
(define str "hello") ;Value: str
(eq? str str) ;Value: #t
(eq? "hello" "hello") ;Value: () ”hello”和”hello”被储存在了不同的地址中
(eq? 1 1) ;Value: #t ;;; comparing numbers depends on implementations
(eq? 1.0 1.0) ;Value: ()
```
### eqv?
比较值
```
(eqv? 1.0 1.0) ;Value: #t
(eqv? 1 1.0) ;Value: ()
(eqv? (list 1 2 3) (list 1 2 3)) ;Value: () ;;; don't use it to compare sequences
(eqv? "hello" "hello") ;Value: ()
(eqv? (lambda(x) x) (lambda (x) x)) ;Value: () ;;; the following depends on implementations
```
### equal?
比较表或字符串
```
(equal? (list 1 2 3) (list 1 2 3)) ;Value: #t 比较表
(equal? "hello" "hello") ;Value: #t
```
';