September 29, 2006

Scheme学习笔记(四)

(下一篇是最后一篇,讨论宏,结构和面向对象(其实没什么用))

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

No comments: