Comment faire la somme d'une liste de nombres dans Emacs Lisp?

Ceci fonctionne:

(+ 1 2 3)
6

Cela ne fonctionne pas:

(+ '(1 2 3))

Cela fonctionne si 'cl-* " est chargé:

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

Si reduce toujours été disponible, je pourrais écrire:

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

(sum '(1 2 3))
6

Quelle est la meilleure pratique pour définir des fonctions telles que <!--6?

28
demandé sur jfs 2009-02-26 16:37:15

8 réponses

(apply '+ '(1 2 3))
64
répondu kmkaplan 2009-02-26 13:45:00

si vous manipulez des listes et écrivez du code fonctionnel dans Emacs, installez dash.el bibliothèque. Alors vous pourriez utiliser son -sum fonction:

(-sum '(1 2 3 4 5)) ; => 15
3
répondu Mirzhan Irkegulov 2014-03-18 11:15:47

fonction récursive linéaire (somme L)

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

        (+ 
            (first list) 
            (sum (rest list))
        )   
    )   
)
2
répondu Kristo Aun 2012-12-21 18:56:42

Vous pouvez définir votre fonction personnalisée pour calculer la somme d'une liste passée.

(defun sum (lst) (format t "The sum is ~s~%" (write-to-string (apply '+ lst))) 
EVAL: (sum '(1 4 6 4))
-> The sum is "15"
0
répondu Sudhanshu Mishra 2013-11-02 14:58:52

Cela devrait faire l'affaire:

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

[source]

Edit: Voici un bon lien qui explique car et cdr - ils sont essentiellement des fonctions qui vous permettent de saisir le premier élément d'une liste et récupérer une nouvelle liste sans le premier élément.

-1
répondu Andrew Hare 2009-02-26 13:40:35

voiture -> premier élément de la liste

cdr - > prenez tous les éléments de la liste sauf le premier élément

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

(sumup '(5 7 8 10))

30

-1
répondu Abakan Marajapov 2013-05-13 04:30:03

(eval (cons '+ '(1 2 3))) -- bien que pas aussi bon que 'réduire'

-2
répondu user946443 2011-09-17 11:31:37

(inscrire (nombre à la chaîne de caractères)'+ '(1 2 3))))

-2
répondu Яков Кацман 2017-04-02 17:20:12