2009-02-26 6 views
26

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

(+ 1 2 3) 
6 

Cela ne fonctionne pas:

(+ '(1 2 3)) 

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

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

Si reduce étaient toujours disponibles, 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 sum?

+0

S'il vous plaît ne changez pas la question, ouvrez un nouveau . – kmkaplan

+0

J'ai annulé la question. – jfs

Répondre

60
(apply '+ '(1 2 3)) 
+0

Merci. J'ai pensé qu'il me manquait quelque chose de trivial. – jfs

0

Cela devrait faire l'affaire:

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

[source]

Edit: Here is another good link qui explique car et cdr: - ils sont des fonctions qui vous permettent de saisir le premier élément d'une liste et de récupérer un nouvelle liste sans le premier élément.

+2

La récursion est * mauvaise * dans Emacs Lisp. – kmkaplan

+1

Pourquoi la récursivité est-elle mauvaise? –

+0

J'essayais d'éviter de faire exactement cela. – jfs

-2

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

+3

Il n'y a pas besoin d'eval. Appliquer fait la même chose. – jrockway

+0

Oui, c'était juste pour montrer que cela pouvait aussi être fait de cette manière. – user946443

3

fonction Linéairement récursif (somme L)

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

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

Renversé pour valeur comique. J'aime particulièrement le commentaire de style c et l'utilisation de parenthèses de style c. Or. –

-1

voiture -> prendre premier élément de la liste

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

(defun sumup (x) (si (égale x zéro) 0 (+ (voiture x) (sumup (CDR x)))))

(sumup « (5 7 8 10))

0

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

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

Si vous manipuler des listes et d'écrire du code fonctionnel dans Emacs, installez la bibliothèque dash.el. Ensuite, vous pouvez utiliser sa fonction -sum:

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

(insert (numéro à chaîne (appliquer '+' (1 2 3))))

Questions connexes