在Lisp的第 329 页,Conrad Barski使用以下示例代码解释了记忆技术
(let ((old-neighbors (symbol-function 'neighbors))
(previous (make-hash-table)))
(defun neighbors (pos)
(or (gethash pos previous)
(setf (gethash pos previous) (funcall old-neighbors pos)))))
这个想法很好:当我调用neighbors
函数时,我将结果保存到哈希表中,这样下次neighbors
使用相同的值调用时pos
,我可以查找结果而无需再次计算。
所以我想知道,通过编辑和重新编译它的源代码(在本书的第 314 页给出)neighbors
来重命名函数是否更容易。old-neighbors
然后记忆示例可以简化为
(let ((previous (make-hash-table)))
(defun neighbors (pos)
(or (gethash pos previous)
(setf (gethash pos previous) (funcall old-neighbors pos)))))
或者,通过预先previous
变成一个全局变量,甚至变成*previous-neighbors*
(defun neighbors (pos)
(or (gethash pos *previous-neighbors*)
(setf (gethash pos *previous-neighbors*) (funcall old-neighbors pos))))
从而使关闭变得不必要。
所以我的问题是:这样做的原因是什么?
我能想到的原因:
- 它具有教学意义,展示了使用闭包(之前已经解释过)可以做什么,并提供了
symbol-function
. - 即使在您不能或可能不会更改
neighbors
. - 我错过了一些东西。