如何在Emacs Lisp中汇总数字列表?

时间:2009-02-26 13:37:15

标签: emacs elisp

这有效:

(+ 1 2 3)
6

这不起作用:

(+ '(1 2 3))

如果加载了“cl-*”,则此方法有效:

(reduce '+ '(1 2 3))
6

如果reduce始终可用,我可以写:

(defun sum (L)
  (reduce '+ L))

(sum '(1 2 3))
6

定义sum等功能的最佳做法是什么?

8 个答案:

答案 0 :(得分:64)

(apply '+ '(1 2 3))

答案 1 :(得分:3)

如果您在Emacs中操作列表并编写功能代码,请安装dash.el库。然后你可以使用它的-sum函数:

(-sum '(1 2 3 4 5)) ; => 15

答案 2 :(得分:2)

线性递归函数(和L)

;;
;; sum
;;
(defun sum(list)    
    (if (null list)
        0

        (+ 
            (first list) 
            (sum (rest list))
        )   
    )   
)

答案 3 :(得分:0)

您可以定义自定义函数来计算传递给它的列表的总和。

(defun sum (lst) (format t "The sum is ~s~%" (write-to-string (apply '+ lst))) 
EVAL: (sum '(1 4 6 4))
-> The sum is "15"

答案 4 :(得分:-1)

这应该是诀窍:

(defun sum-list (list)
  (if list
      (+ (car list) (sum-list (cdr list)))
    0))

[source]

编辑:Here is another good link解释carcdr - 基本上它们是允许您抓取列表的第一个元素并检索第一个项目的新列表的函数。< / p>

答案 5 :(得分:-1)

汽车 - &gt;获取列表的第一个元素

cdr - &gt;获取列表中除第一个元素

之外的所有元素
  

(defun sumup(x)(if(等于x nil)0(+(car x)(sumup(cdr x)))))

     

(总和'(5 7 8 10))

     

30

答案 6 :(得分:-2)

(eval (cons '+ '(1 2 3))) - 虽然不如'reduce'

答案 7 :(得分:-2)

(插入(数字到字符串(应用'+'(1 2 3))))