如何在Emacs Lisp中对数字列表求和?
这项工作:如何在Emacs Lisp中对数字列表求和?,emacs,elisp,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)的最佳实践是什么?这应该做到: (defun sum-list (list) (if list (+ (car list) (sum-list (cdr l
(+ 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
)的最佳实践是什么?这应该做到:
(defun sum-list (list)
(if list
(+ (car list) (sum-list (cdr list)))
0))
编辑:这就解释了
car
和cdr
-基本上它们是允许您获取列表的第一个元素并检索新列表而不包含第一个项目的函数。(eval(cons'+'(1 2 3))
——尽管不如“reduce”(减少)线性递归函数(sum L)
(apply '+ '(1 2 3))
您可以定义自定义函数来计算传递给它的列表的总和
(defun sum (lst) (format t "The sum is ~s~%" (write-to-string (apply '+ lst)))
EVAL: (sum '(1 4 6 4))
-> The sum is "15"
若您在Emacs中操作列表并编写功能代码,请安装库。然后你可以使用它的功能:
(-sum '(1 2 3 4 5)) ; => 15
(insert(number to string(apply'+'(1 2 3)))递归在Emacs Lisp中是不好的。我正试图避免这样做。大多数时候,您应该能够使用reduce和各种map操作,而不是显式地处理cars和CDR。因为Emacs Lisp不进行尾部调用优化。更重要的是,您的和列表递归不在尾部位置。是的。但请记住,不要使用Emacs Lisp,只使用Lisp,它可以优化尾部调用。谢谢。我认为我遗漏了一些琐碎的东西。请不要更改问题,打开一个新问题。我已将问题回滚。不需要评估。Apply也做同样的事情。是的,这只是为了表明它也可以用这种方式来完成。
(-sum '(1 2 3 4 5)) ; => 15