我正在寻找一种方法来修改属性列表中的属性值,方法是将其与给定因子相乘,类似于使用 incf 添加到值。
使用 incf 我可以说:
(let ((seq '(:x 10 :y 3)))
(incf (getf seq :y) 3)
seq)
-> (:x 10 :y 5)
使用宏我可以通过以下方式获得结果,但这使用 getf 两次:
(defmacro multf (place val)
`(setf ,place (* ,place ,val)))
(let ((seq '(:x 10 :y 3)))
(multf (getf seq :y) 2)
seq)
-> (:x 10 :y 6)
我将如何做到这一点,以便我可以只使用一次 getf 获得相同的结果?
也许有这个功能的包,但我在网上找不到。任何帮助表示赞赏!这不是功课,我只是想优化我的代码,我很想更好地理解这种语言。我读到了 setf-expanders 和 compiler-macros,但我不知道它们是否适用于这里以及如何使用它们。