* = Common Lisp中的操作

时间:2017-04-21 09:32:00

标签: c arrays common-lisp

我想知道Common Lisp中是否有一些函数/宏与C /​​ C ++中的 * = / = 操作具有相似的功能。

Common Lisp中的 {strong> incf decf 可被视为 + = - =

在C / C ++

A *= 2;

等于

A = A * 2;

在Common Lisp中

当我想为数组元素设置一个新值时,我必须写为

(setf (aref arr i) (* (aref arr i) 2))

访问数组的语句必须写两次,如果有一个函数/宏 mulf 在C语言中具有与 * = 类似的功能。

我可以编写代码

(mulf (aref arr i) 2)

然后只需要编写一次数组访问语句。

感谢。

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)))