如何在普通的 lisp 中编写 multf 函数
How to write a multf function in common lisp
我正在寻找一种方法来修改 属性 列表中的 属性 值,方法是将它与给定的因子相乘,类似于使用 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,但我不知道它们是否适用于这里以及如何使用它们。
but this uses getf twice
第一个是 SETF 形式,第二个是 getter。第一个将由SETF扩展。
multf
使用 define-modify-macro 的简短定义可能是:
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)
我正在寻找一种方法来修改 属性 列表中的 属性 值,方法是将它与给定的因子相乘,类似于使用 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,但我不知道它们是否适用于这里以及如何使用它们。
but this uses getf twice
第一个是 SETF 形式,第二个是 getter。第一个将由SETF扩展。
multf
使用 define-modify-macro 的简短定义可能是:
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)