gpt4 book ai didi

Emacs Lisp : How to sum odd numbers in a list?

转载 作者:行者123 更新时间:2023-12-04 09:29:53 24 4
gpt4 key购买 nike

我想找到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-* 包)?
有关的:

How to sum a list of numbers in Emacs Lisp?

最佳答案

惯用的方法是使用 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))))

但这使用 dolistincf两者都在 cl-macs 中包裹。基本上你无法逃脱 cl包裹: oddp本身就是一个 cl功能!

我的最大努力绝对没有 cl设施是这样的:
(apply #'+ (mapcar (lambda (x) (* x (mod x 2))) list))

但在实践中使用它而不是 (loop ...) 是荒谬的版本。

关于Emacs Lisp : How to sum odd numbers in a list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com