四. 流程控制
- Scheme中只有if操作是内置的,其它用宏实现。
- 应尽量用尾递归代替循环。
- (if (测试表达式) (操作) (else操作))
- 由多个语句构成的操作用(begin)语句组合
- (when (测试表达式) (多个操作))
- (when (非测试表达式) (多个操作))
- 其它的操作式不必用begin组合
- case语句:
((#\a) 1)
((#\b) 2)
((#\c) 3)
(else 4)) => 3
- 逻辑表达式操作:
- and在无非比较时返回后一个值:(and 1 2) => 2
(and #f 1) => #f - r在无非比较时返回前一个值:(or 1 2) => 1
(or #f 1) => 1
- 不能工作的代码,因为let或let*会将操作名绑定到各自的词法定界,导致互相递归调用的函数不能互访:
(if (= n 0) #t
(local-odd? (- n 1)))))
(local-odd? (lambda (n)
(if (= n 0) #f
(local-even? (- n 1))))))
- 把绑定操作换成letrec即可。
- 由begin引导的语句序列返回最后一个语句的值。
- 命名let可简化局部递归调用:
(if (= i 0) ’liftoff
(begin
(display i)
(newline)
(countdown (- i 1))))) ;输出一个整数递减过程中的每个值
- 迭代器(for-each 操作 (被操作list))
- 迭代器(map 操作 (被操作list)),返回list中每一个被操作项构成的list(python里的那个函数的同名被复制品)。