gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:21:28 24 4
gpt4 key购买 nike

我正在寻找一种通过将属性值乘以给定因子来修改属性列表中的属性值的方法,类似于使用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和compile-macros的文章,但我不知道它们是否适用于此以及如何使用它们。

最佳答案

but this uses getf twice



第一个是SETF表单,第二个是 setter/getter 。第一个将由SETF扩展。

使用 define-modify-macromultf的简短定义可能是:
CL-USER 28 > (define-modify-macro multf (&optional (number 1)) *)
MULTF

CL-USER 29 > (let ((seq '(:x 10 :y 3)))
(multf (getf seq :y) 2)
seq)
(:X 10 :Y 6)

LispWorks中的完整扩展如下所示:
(LET ((SEQ '(:X 10 :Y 3)))
(LET* ((#:G1158 :Y))
(LET* ()
(LET ((#:G1157 (* (GETF SEQ #:G1158) 2)))
(LET ((#:|Store-Var-1156| (SYSTEM::PRIMITIVE-PUTF SEQ #:G1158 #:G1157)))
(SETQ SEQ #:|Store-Var-1156|)
#:G1157))))
SEQ)

关于common-lisp - 如何在通用Lisp中编写Multf函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56912429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com