В главе 16 «Закаленного мошенника» авторы определяют рекурсивную процедуру «глубина», которая возвращает «пиццу, вложенную в n списков, например, (глубина 3) есть (((пицца)))». Затем они улучшают его как «deepM», который кэширует свои возвращаемые значения с помощью set! в списках Ns и Rs, которые вместе образуют справочную таблицу, поэтому вам не нужно проходить весь путь вниз, если вы достигнете возвращаемого значения, которое видели ранее. Например. Если я уже вычислил (глубину 8), когда я позже вычислю (глубина 9), я просто ищу возвращаемое значение (глубина 8) и выводит его в ноль, вместо того, чтобы возвращаться к (глубина 0).
Но затем они перемещают Ns и Rs внутри процедуры и инициализируют их нулем с помощью let. Почему это не лишает смысла кэширование возвращаемых значений? После небольшого эксперимента выясняется, что N и R переинициализируются при каждом вызове «deepM».
Я неправильно понимаю их точку зрения?
Полагаю, мой вопрос действительно такой: есть ли в Scheme способ, чтобы переменные с лексической областью сохраняли свои значения между вызовами процедуры, как вы можете сделать это в Perl 5.10 с переменными «состояния»?