2009-02-26 24 views
26

to działa:Jak podsumować listę numerów w Emacs Lisp?

(+ 1 2 3) 
6 

To nie działa:

(+ '(1 2 3)) 

To działa, jeśli 'cl-*' jest załadowany:

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

Jeśli reduce były zawsze dostępne mógłbym napisać:

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

(sum '(1 2 3)) 
6 

Jaki jest najlepszy sposób definiowania funkcji, takich jak sum?

+0

Proszę nie zmieniać na pytanie, otwórz nowy . – kmkaplan

+0

Wstrzymałem pytanie. – jfs

Odpowiedz

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

Dzięki. Myślałem, że brakuje mi czegoś trywialnego. – jfs

0

To powinno załatwić sprawę:

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

[source]

Edit: Here is another good link który wyjaśnia car i cdr - w zasadzie są funkcje, które pozwalają, aby pobrać pierwszy element listy i przywracanie nowa lista bez pierwszego elementu.

+2

Rekursja jest * zła * w Emacs Lisp. – kmkaplan

+1

dlaczego rekursja jest zła? –

+0

Starałem się tego nie robić. – jfs

-2

(eval (cons '+ '(1 2 3))) - choć nie tak dobre jak 'zredukować'

+3

Nie ma potrzeby sprawdzania. Zastosuj robi to samo. – jrockway

+0

Tak, chodziło tylko o pokazanie, że można to zrobić w ten sposób. – user946443

3

liniowo funkcja rekurencyjna (suma L)

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

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

Wznowienie dla wartości komediowej. Szczególnie podoba mi się komentarz w stylu c i użycie nawiasu w stylu c. Złoto. –

-1

samochód -> wziąć pierwszy element listy

cdr -> weź wszystkie elementy listy oprócz pierwszego elementu

(defun sumup (x) (jeśli (równej x ml) 0 (+ (CAR x) (sumup (CDR x)))))

(sumup „(5 7 8 10))

0

można zdefiniować niestandardową funkcję, aby obliczyć sumę wykazu przekazanego do niego.

(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

Jeśli manipulować list i napisać kod funkcjonalny w Emacs zainstalować dash.el bibliotekę. Następnie można użyć jej -sum funkcję:

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

(wkładkę (liczby na ciąg (za '+' (1 2 3))))

Powiązane problemy