1. scheme十戒五律


1.1. scheme十戒

  1. 当对一个原子列表进行递归时,要注意两个问题:(null? lat) and else。

    当对一个数字进行递归时,要注意两个问题:(zero? n) and else。

    当对一个S表达式列表进行递归时,要注意三个问题:(null? l), (atom? (car l)) 和 else。

  2. 使用cons来创建列表。

  3. 当创建一个列表时,先描述第一个元素,然后用cons来将它和递归连接在一起

  4. 递归时,至少要改变一个参数。 例如:递归一个原子列表使用(cdr lat);递归一个数字使用(sub1 n);

    递归一个S表达式时,如果这个表达式即不(null? l),也不(atom? (car l)), 那么使用(car l) 和 (cdr l)。

    并且该参数必须要越来越接近终止元素。在终止条件里面必须要对正在变化的参数进行检查:

    • 当使用cdr时,终止条件使用null?
    • 当使用sub1时,终止条件使用zero?
  5. 当你使用+来创建一个值时,必须总要用0来作为终止,0加上任何值都不会改变原来的值。

    当你使用*来创建一个值时,必须总要用1来作为终止,1乘以任务值都不会改变原来的值。

    当你使用cons来创建一个值时,必须总要用()来作为终止。

  6. 当函数运行正确后再考虑简化函数。

  7. 当一个对象的子对象是与其本身表现一致时,这时候可用递归操作。比如:

    • 一个列表的子列表
    • 一个算术表达式的子表达式
  8. 使用辅助函数来简化表述。

  9. 使用新的函数来抽象公共模式。

  10. 创建连续函数时,尽量能够一次性获取更多的值。

1.2. scheme五律

  1. car函数最初只是用在非空列表上的。
  2. cdr函数最初只是用在非空列表上的,(cdr non-null-list)的结果是另一个列表。
  3. cons函数最初只接受两个参数,第二个参数必须是一个列表,它返回的结果也是一个列表。
  4. null?函数只对列表有用。
  5. eq?函数只接受两个参数,两个参数必须都是非数字的原子。