我需要一些帮助来重新编写这个函数在普通的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开头的那一行。
提前感谢您的帮助!
答案 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)))
使用适合该情况的高阶函数允许函数样式,而无需明确命名临时值。代码更清晰,人类编码器更容易出错。