我想找到elisp的类比:
sum(n for n in numbers if n % 2) # Python numbers.select { |n| n % 2 != 0 }.inject { |a, b| a + b } # Ruby
势在必行:
(defun oddp (number) (not (= (mod number 2) 0))) (defun sum-odd-with-dolist (list) (let ((acc 0)) (dolist (item list acc) (if (oddp item) (setq acc (+ item acc))))))
来自Porting Common Lisp:
(defun sum-odd-with-dolist-incr (list) (let ((total 0)) (dolist (item list) (if (oddp item) (incf total item))) total))
使用' cl-*
' loop
:
(defun sum-odd-with-loop (list) (loop for x in list if (oddp x) sum x)) (sum-odd-with-loop '(1 2 3)) 4
是否有更惯用的方法(不需要cl-*
包)?
如何在Emacs Lisp中汇总数字列表?
Gareth Rees.. 14
惯用的方法是使用包中的函数和宏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 ...)
版本是荒谬的.
惯用的方法是使用包中的函数和宏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 ...)
版本是荒谬的.
(apply '+ (delq nil (mapcar (lambda (x) (and (= 1 (% x 2)) x)) '(1 2 3 4 5))))