Произведение внутри списка - Lisp

Формулировка задачи:

Добрый вечер всем! Подскажите как через цикл do организовать нахождение произведения внутри списка. Т.е (1 2 3 (3 6) 2 1 (2 4) 2 ) - такого например. Нужно через do реализовать, как не могу понять, точнее не могу понять как доставать элементы из списка и производить над ними действия. Писал с помощью dolist, но он не учитывает вложенные списки. Сказали через do легче будет реализовать, посему прошу помощи. Вот пример реализации через dolist:
(defun func3 (sp) (setq rez 1)  (dolist (el sp) (setq rez (* rez el)) ) (print rez) )
Спасибо всем откликнувшимся!

Код к задаче: «Произведение внутри списка - Lisp»

textual
(defun mult (nums)
  (do ((stack (list nums))
       (acc 1)
       current)
      ((null stack) acc)
    (setf current (pop stack))
    (do ()
        ((null current) t)
       (if (atom (car current))
           (setf acc (* acc (car current)))
           (push (car current) stack))
       (setf current (cdr current)))))
 
> (mult '(1 2 3 (3 6) 2 1 (2 4) 2))
3456

13   голосов, оценка 3.769 из 5


СОХРАНИТЬ ССЫЛКУ