Lisp十戒五律

十戒


  • 第一戒
  • 当递归原子列表lat时,要思考:(null? lat)和其他

  • 当递归数字 n时,要思考:(zero? n)else

  • 当递归s表达式 l 时列表时,要思考:
    (null? l)else
    (atom? (car l))else

  • 第二戒
  • 使用cons创建列表

  • 第三戒
  • 当创建列表时,先写下第一个元素,然后通过递归方式使用cons来进行创建

  • 第四戒
  • 当递归时,总是至少要改变一个参数

  • 当递归原子列表flat时,使用(cdr lat)

  • 当递归数字n时,使用(sub1 n)

  • 当递归s表达式l时,当l即不是(null ?)也不是(atom? (car l))时,使用(car l)(cdr l)

  • 参数必须不断变化以达成结束条件。变化后的参数必须进行结束条件测试:

    • 当使用cdr时,使用null?测试是否结束
    • 当使用sub1时,使用zero?测试是否结束
  • 第五戒
  • 当使用+创建值时,使用0来作为结束,0不会改变加数的值

  • 当使用*来创建值时,使用1来作为结束,乘1不会改变乘数的值

  • 当使用cons来创建值时,应该考虑使用()做为终结

  • 第六戒
  • 函数正确是精简代码的前提

  • 第七戒
  • 当子组件与父组件相同,则可以用递归便利,如

  • 列表中的子列表

  • 算数表达式的子表达式

  • 第八戒
  • 使用辅助函数来抽象表现

  • 第九戒
  • 将共用部分抽象为一个新函数

  • 第十戒
  • 创建函数时尽量一次性接受可能多的值

五律


  • Car法则
    • 原始(snsr)car只能用于非空列表
  • Cdr法则
  • 原始(snsr)cdr只能用于非空列表

  • cdr产生一个新列表

  • Cons法则
    • 原始(snsr)cons接受两个参数
    • cons的第二个参数必须为一个列表
    • 结果是一个列表
  • Null?法则
    • 原始(snsr)null?只对列表进行判断,只有当空列表时才返回#t,否则返回#f
  • Eq?法则
    • 原始(snsr)eq?接受两个参数
    • 每个参数必须是非数字的原子

你可能感兴趣的:(Lisp十戒五律)