Вы передаете случай, когда список пуст и когда вы на самом деле находите кратное 3, но что произойдет, если вам нужно пропустить еще один номер? Вы используете термин по умолчанию, поэтому Common Lisp вернет nil
. Например, ваш код работает так:
(defun sumel (li)
(cond
((null li) 0)
((zerop (rem (car li) 3))
(+ (car li) (sumel (cdr li))))
(t nil))) ; when not a multiple of 3 we are finished, return nil
Попробуйте оценить (cond)
, и вы увидите, что он такой же, как (cond (t nil))
.
Вы исправите это, добавив (sumel (cdr l))
в качестве альтернативы. Следует оценить сумму, кратную остальной части списка, что и нужно.