不使用 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)))
使用适合这种情况的高阶函数可以实现函数式风格,而无需明确命名中间值。代码更清晰,更不容易被人类编码员出错。
我需要一些帮助来在不使用 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)))
使用适合这种情况的高阶函数可以实现函数式风格,而无需明确命名中间值。代码更清晰,更不容易被人类编码员出错。