Идиоматический способ сделать это - использовать функции и макросы в пакетах cl
. Они входят в стандартную комплектацию Emacs Lisp, и в их использовании нет ничего плохого.
Я сомневаюсь, что вы найдете способ сделать это столь же кратким и ясным, как
(loop for x in list if (oddp x) sum x)
Есть более функциональные способы сделать это, например
(apply #'+ (remove-if-not #'oddp list))
, но при этом используется remove-if-not
из пакета cl-seq
. Вы можете написать цикл вручную:
(let ((sum 0)) (dolist (x list sum) (when (oddp x) (incf sum x))))
но для этого используются dolist
и incf
, которые находятся в пакете cl-macs
. По сути, вы не можете избежать пакета cl
: oddp
сама по себе является функцией cl
!
Мое лучшее усилие, использующее абсолютно никаких cl
средств, таково:
(apply #'+ (mapcar (lambda (x) (* x (mod x 2))) list))
но было бы абсурдно использовать это на практике вместо (loop ...)
версии.