小编Orm*_*ahl的帖子

如何在通用Lisp中编写Multf函数

我正在寻找一种通过将属性值乘以给定因子来修改属性列表中的属性值的方法,类似于使用incf来添加值。

使用incf,我可以说:

(let ((seq '(:x 10 :y 3)))
 (incf (getf seq :y) 3)
 seq)

-> (:x 10 :y 5)
Run Code Online (Sandbox Code Playgroud)

使用宏,我可以通过以下方式获得结果,但这两次使用了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)
Run Code Online (Sandbox Code Playgroud)

我该怎么做,这样我只能使用getf一次获得相同的结果?

也许有些软件包具有此功能,但是我在网上找不到它。任何帮助表示赞赏!这不是功课,我只是在尝试优化我的代码,并且很好地理解语言。我读了有关setf-expanders和compile-macros的文章,但我不知道它们是否适用于此以及如何使用它们。

common-lisp setf

5
推荐指数
1
解决办法
71
查看次数

标签 统计

common-lisp ×1

setf ×1