不使用set,setf或setq

时间:2016-12-24 16:16:07

标签: loops functional-programming lisp common-lisp clisp

我需要一些帮助来重新编写这个函数在普通的lisp中,而无需使用SET,SETF或SETQ(我也不能使用循环),我希望有人可以帮助我。 这是代码:

(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开头的那一行。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

对列表重复累积操作称为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)))

使用适合该情况的高阶函数允许函数样式,而无需明确命名临时值。代码更清晰,人类编码器更容易出错。