不使用 set、setf 或 setq 重写

re-write without using set, setf or setq

我需要一些帮助来在不使用 SET、SETF 或 SETQ 的情况下用 common lisp 重写这个函数(我不能也使用循环),我希望有人能帮助我。 这是代码:

(defun apply-values (DictValues Monomial)
   (let ( (Coeff (monomial-coefficient Monomial))
          (Vars (varpowers Monomial))
          (Acc 1) )
     (mapcar (lambda(x)
               (setf Acc (* Acc (expt 
                                  (cdr (assoc (varpower-symbol x) DictValues))
                                  (varpower-power x))))) 
             Vars)
     (* Coeff Acc)))

我的问题出在以 mapcar 开头的那一行。

在此先感谢您的帮助!

对列表的重复累加操作称为reduction:

(defun apply-values (DictValues Monomial)
   (reduce #'*
           (mapcar 
               (lambda (x)
                   (expt (cdr (assoc (varpower-symbol x) DictValues))
                         (varpower-power x)))
               (varpowers Monomial))
           :initial-value (monomial-coefficient Monomial)))

使用适合这种情况的高阶函数可以实现函数式风格,而无需明确命名中间值。代码更清晰,更不容易被人类编码员出错。