2016-12-24 13 views
-1

Мне нужна помощь, чтобы перезаписать эту функцию в общем lisp без usin SET, SETF или SETQ (я также не могу использовать циклы), я надеюсь, что кто-то может мне помочь , вот код:перезаписать без использования 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))) 

Использование функции высшего порядка, которые должным образом соответствуют ситуации позволяют функциональному стиль, без явного именования промежуточных значений. Код более ясен и менее подвержен ошибкам с помощью человеческого кодера.

+1

@ user7337963 Для другого упражнения попробуйте избавиться от промежуточной карты. – coredump

+1

@coredump очень хорошее предложение! Действительно, OP должен попробовать его и задать другой вопрос, если у него есть проблемы с ним. Подсказка: речь идет о замене '# '*' настраиваемой лямбда-функцией (в sloppy псевдокоде, 'сокращение (объединение x) (map f xs)' == 'сокращение (объединение a (f x)) xs'). Подробности указаны в CLHS (ссылка в ответе). –