重新命名 (Renaming)

在某些场合里(但不是全部场合),有一种特别狡猾的 bug ,起因于重新命名函数或变量,。举例来说,假设我们定义下列(低效的) 函数来找出双重嵌套列表的深度:

  1. (defun depth (x)
  2. (if (atom x)
  3. 1
  4. (1+ (apply #'max (mapcar #'depth x)))))

测试函数时,我们发现它给我们错误的答案(应该是 1):

  1. > (depth '((a)))
  2. 3

起初的 1 应该是 0 才对。如果我们修好这个错误,并给这个函数一个较不模糊的名称:

  1. (defun nesting-depth (x)
  2. (if (atom x)
  3. 0
  4. (1+ (apply #'max (mapcar #'depth x)))))

当我们再测试上面的例子,它返回同样的结果:

  1. > (nesting-depth '((a)))
  2. 3

我们不是修好这个函数了吗?没错,但答案不是来自我们修好的代码。我们忘记也改掉递归调用中的名称。在递归用例里,我们的新函数仍调用先前的 depth ,这当然是不对的。