不使用 set、setf 或 setq 重写

use*_*963 0 lisp loops clisp functional-programming common-lisp

我需要一些帮助来在 common lisp 中重写这个函数而不使用 usin SETSETF或者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)))
Run Code Online (Sandbox Code Playgroud)

我的问题是在以 开头的行mapcar

在此先感谢您的帮助!

Wil*_*ess 5

对列表的重复累积操作称为归约

(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)))
    
Run Code Online (Sandbox Code Playgroud)

使用正确适合情况的高阶函数可以实现函数式风格,而无需显式命名临时值。代码更加清晰,人类编码员不易出错。