条件表达式
检查一个数是正的, 负的或者零
在lisp里有着一种针对这类分情况分析的特殊形式, 称为cond. 其使用形式如下 :
(define (abs x)
(cond ((> x 0) x)
((= x 0) 0)
((< x 0) (-x))))
条件表达式的一般性形式为
(cond (<p1> <e1>)
(<p2> <e1>)
...
(<pn> <en>))
这里首先包含了一个符号cond,在它之后跟着一些称为子句的表达式对偶,他的值将被解释为真或假.
另一种写绝对值函数的方式是
(define (abs x)
(cond ((< x 0) (-x))
(else x)))
这里表示, 如果x小于0就会返回-x, 否则就返回x.
if表达式
if表达式的一般形式是 :
(if <predicate> <consequent> <alternative>)
,
使用if表达式写绝对值函数的方式 :
(define (abs x)
(if (< x 0)
(- x)
x))
逻辑复合运算符
(and <e1> ... <en>)
: 解释器将从左到右一个个的求值.如果某个<e>
求值得到假, 这一and
表达式的值就是假, 如果前面所有的<e>
都求出真值, 这一and表达式的值就是最后那个<e>
的值(or <e1> ... <en>)
: 解释器将从左到右一个个的求值<e>
, 如果某个<e>
求值得到真, or表达式就以这个表达式的值作为值, 后面的那个<e>
也不再求值了. 如果所有的<e>
都求出假值, 这一or
表达式的值就是假(not <e>)
: 如果<e>
求出的值是假.not
表达式的值就是真.
例子 :
- 5 < x < 10 可以写为 :
(and (> x 5) (< x 10))
- 检测某个数是否大于或者等于另一个数 :
(define (>= x y))
(or (> x y) (= x y))
联系1.1
(define b (+ a 1))
(+ a b (* a b))
(= a b)
(if (and (> b a) (< b (* a b)))
b
a)
(cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25)
)
(+ 2 (if (> b a) b a))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
返回
(define b (+ a 1))
(+ a b (* a b))
(= a b)
(if (and (> b a) (< b (* a b)))
b
a)
(cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25)
)
(+ 2 (if (> b a) b a))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
联系1.2
将数学算式
从中序表达式转换成前序表达式 :
((+ (+ 5 4 ) + (- 2+ (- 3+ (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))
联习 1.3
定义一个过程, 它以三个数为参数, 返回其中较大的两个数的平方和
(defind squeares x
(* x x))
(defind (sum-for-squares x y)
)