在“The Seasoned Schemer”的第 16 章中,作者定义了一个递归过程“depth”,它返回嵌套在 n 个列表中的 'pizza,例如 (depth 3) is ((((pizza)))。然后他们将其改进为“depthM”,它使用 set 缓存其返回值!在列表 Ns 和 Rs 中,它们一起形成了一个查找表,因此如果您达到以前见过的返回值,则不必一直向下递归。例如,如果我已经计算过 (depthM 8),当我稍后计算 (depthM 9) 时,我只需查找 (depthM 8) 的返回值并将其设置为 null,而不是一直递归到 (depthM 0) .
但随后他们将 Ns 和 Rs 移动到过程中,并用“let”将它们初始化为 null。为什么这不能完全破坏缓存返回值的意义?从一些实验来看,Ns 和 Rs 似乎在每次调用“depthM”时都被重新初始化。
我误解了他们的观点吗?
我想我的问题确实是这样的:Scheme 中有没有办法让词法范围的变量在调用过程之间保留它们的值,就像你可以在 Perl 5.10 中使用“状态”变量一样?