【发布时间】:2014-02-25 07:59:47
【问题描述】:
背景
根据我对 Common Lisp 的有限经验,我发现这样的代码并不少见
(setf (gethash key table)
(my-transformation (gethash key table)))
您从setfable 位置读取的位置,对存储在那里的值执行一些计算,然后写入同一个位置。我不喜欢这个地方的地方将被计算两次,但地方(希望!)两次都是一样的。如果位置计算成本很高,我们所做的工作量是我们需要的两倍。
问题
是否可以消除双重计算的需要?也就是说,是否可以(可取?)编写宏setf-inplace:
(setf-inplace (gethash key table) #'my-transformation)
与原始代码在概念上等效(暂时忽略 multiple-values 怪异)但可能比原始代码快得多,最好不依赖实现细节?
我知道在这种特殊情况下我可能会把车放在马的前面,因为SBCL caches the lookup for gethash,但在我看来,其他setf 可能的地方,比如(assoc key my-alist),可能并不那么容易缓存——当然,除了通过上面的setf-inplace 之类的机制。
【问题讨论】:
标签: common-lisp