我想知道Common Lisp中是否有一些函数/宏与C / C ++中的 * = 或 / = 操作具有相似的功能。
Common Lisp中的 {strong>incf
和 decf
可被视为 + = 和 - =
A *= 2;
等于
A = A * 2;
当我想为数组元素设置一个新值时,我必须写为
(setf (aref arr i) (* (aref arr i) 2))
访问数组的语句必须写两次,如果有一个函数/宏 mulf
在C语言中具有与 * = 类似的功能。
我可以编写代码
(mulf (aref arr i) 2)
然后只需要编写一次数组访问语句。
感谢。
答案 0 :(得分:4)
如评论中所述,可以使用DEFINE-MODIFY-MACRO轻松创建。
(define-modify-macro mulf (x) *)
答案 1 :(得分:3)
也不在标准中,但似乎zap宏就在这里。例如:
(zap #'+ x 5)
以下是建议的实现:
(defmacro zap (fn place &rest args)
(multiple-value-bind
(temps exprs stores store-expr access-expr)
(get-setf-expansion place)
`(let* (,@(mapcar #'list temps exprs)
(,(car stores)
(funcall ,fn ,access-expr ,@args)))
,store-expr)))