35

这有效:

(+ 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什么?

4

7 回答 7

74
(apply '+ '(1 2 3))
于 2009-02-26T13:45:00.897 回答
3

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

(-sum '(1 2 3 4 5)) ; => 15
于 2014-03-18T11:15:47.913 回答
2

线性递归函数 (sum L)

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

        (+ 
            (first list) 
            (sum (rest list))
        )   
    )   
)
于 2012-12-21T18:56:42.733 回答
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"
于 2013-11-02T14:58:52.637 回答
-1

这应该可以解决问题:

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

[来源]

编辑:这是另一个很好的链接,它解释了car-cdr基本上它们是允许您获取列表的第一个元素并检索没有第一个项目的新列表的功能。

于 2009-02-26T13:40:35.917 回答
-2

(eval (cons '+ '(1 2 3)))-- 虽然不如“减少”

于 2011-09-16T16:01:23.673 回答
-2

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

于 2017-04-02T17:20:12.173 回答