在The Little Schemer book的第 9 章中,在为任意长输入构建length
函数时,建议如下(在第 170-171 页),在以下代码片段中(来自第 168 页本身):
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
part (mk-length mk-length)
, 将永远不会返回,并将无限地应用于自身:
因为我们只是
mk-length
一次又一次地向自己申请......
和
但是现在我们已经
(mk-length mk-length)
从使它length
不再返回函数的函数中提取出来了。
现在,为了解决这个问题,本书建议:
将
mk-length
我们最后一个正确版本 of 中 to 自身的应用length
变成一个函数。
就像,所以:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0 )
(else
(add1 (length (cdr l)))))))
(lambda (x)
((mk-length mk-length) x)))))
我感到困惑的是:
如果
(mk-length mk-length)
不返回函数
我们如何将结果应用
(mk-length mk-length)
到某个东西上,就好像它是一个函数一样?(lambda (x) ((mk-length mk-length) x))
包装
(mk-length mk-length)
成函数如何解决“永不返回”(即无限递归)问题?我的理解是,在:(lambda (x) ((mk-length mk-length) x))
x
只会被传递给永远不会返回的无限递归函数。