How to sum a list of numbers in Emacs Lisp?

This works:

(+ 1 2 3)
6

This doesn't work:

(+ '(1 2 3))

This works if 'cl-*' is loaded:

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

If reduce were always available I could write:

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

(sum '(1 2 3))
6

What is the best practice for defining functions such as sum?

Answers


(apply '+ '(1 2 3))

If you manipulate lists and write functional code in Emacs, install dash.el library. Then you could use its -sum function:

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

Linearly recursive function (sum L)

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

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

You can define your custom function to calculate the sum of a list passed to it.

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

This ought to do the trick:

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

[source]

Edit: Here is another good link that explains car and cdr - basically they are functions that allow you to grab the first element of a list and retrieve a new list sans the first item.


car -> take first element of list

cdr -> take all elements of the list except first element

(defun sumup (x) (if (equal x nil) 0 (+(car x) (sumup (cdr x)))))

(sumup '(5 7 8 10))

30


(eval (cons '+ '(1 2 3))) -- though not as good as 'reduce'


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


Need Your Help

Print PHP Call Stack

php stack-trace error-logging

I'm looking for a way to print the call stack in PHP.

How to update attributes without validation

ruby-on-rails validation

I've got a model with its validations, and I found out that I can't update an attribute without validating the object before.