【问题标题】:How to sum a list of numbers in Emacs Lisp?如何对 Emacs Lisp 中的数字列表求和?
【发布时间】:2009-02-26 13:37:15
【问题描述】:

这行得通:

(+ 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等函数的最佳做法是什么?

【问题讨论】:

  • 请不要更改问题,打开一个新问题。
  • 我已经回滚了这个问题。

标签: emacs elisp


【解决方案1】:
(apply '+ '(1 2 3))

【讨论】:

  • 谢谢。我认为我错过了一些微不足道的事情。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    线性递归函数(sum L)

    ;;
    ;; sum
    ;;
    (defun sum(list)    
        (if (null list)
            0
    
            (+ 
                (first list) 
                (sum (rest list))
            )   
        )   
    )
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这应该可以解决问题:

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

        [source]

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

        【讨论】:

        • 递归在 Emacs Lisp 中是 bad
        • 我试图避免这样做。
        • 大多数时候,您应该能够使用 reduce 和各种 map 操作,而不是显式处理汽车和 cdrs。
        • 因为 Emacs Lisp 不做尾调用优化。更重要的是,您的 sum-list 递归不在尾部位置。
        • 是的。但是请记住不要使用 Emacs Lisp 来做这件事,而要使用能够为您提供尾调用优化的 Lisps。
        【解决方案6】:

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

        【讨论】:

        • 不需要评估。 Apply 做同样的事情。
        • 是的,这只是为了表明它也可以以这种方式完成。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多