如何在Emacs Lisp中对数字列表求和?

38

这个可行:

(+ 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这样的函数,有什么最佳实践吗?


请将以下与编程有关的内容从英语翻译为中文。 只返回翻译后的文本:请勿更改问题,开新问题进行回答。 - kmkaplan
我已经回滚了这个问题。 - jfs
7个回答

78
(apply '+ '(1 2 3))

谢谢。我一直认为自己缺少一些微不足道的东西。 - jfs

3
如果你在Emacs中操作列表并编写函数式代码,安装dash.el库。然后你可以使用它的-sum函数:
(-sum '(1 2 3 4 5)) ; => 15

2
线性递归函数(sum L)
;;
;; sum
;;
(defun sum(list)    
    (if (null list)
        0

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

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"

-1
这应该能解决问题:
(defun sum-list (list)
  (if list
      (+ (car list) (sum-list (cdr list)))
    0))

【来源】

编辑:这里有另一个好的链接,解释了carcdr - 基本上它们是允许您获取列表的第一个元素并检索新列表的函数,不包括第一个项目。


2
在Emacs Lisp中,递归是不好的 - kmkaplan
我试图避免正是那样做。 - jfs
2
因为Emacs Lisp不执行尾调用优化。而且你的sum-list递归不是在尾部位置。 - kmkaplan
那么你有一个练习:重写你的函数,使它在常数空间中运行。 - kmkaplan
1
是的。但请记住不要使用Emacs Lisp,而是使用支持尾调用优化的Lisp语言。 - kmkaplan
显示剩余6条评论

-2

(insert (number-to-string (apply '+ '(1 2 3))))

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


-2

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


3
不需要使用eval函数,使用apply函数可以达到同样的效果。 - jrockway
是的,这只是为了展示也可以用这种方式完成。 - user946443

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接