Как суммировать список чисел в Emacs Lisp? - PullRequest
28 голосов
/ 26 февраля 2009

Это работает:

(+ 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?

Ответы [ 8 ]

64 голосов
/ 26 февраля 2009
(apply '+ '(1 2 3))
3 голосов
/ 18 марта 2014

Если вы управляете списками и пишете функциональный код в Emacs, установите библиотеку dash.el. Тогда вы можете использовать функцию -sum:

(-sum '(1 2 3 4 5)) ; => 15
2 голосов
/ 21 декабря 2012

Линейно-рекурсивная функция (сумма L)

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

        (+ 
            (first list) 
            (sum (rest list))
        )   
    )   
)
0 голосов
/ 02 апреля 2017

(вставить (число в строку (применить '+' (1 2 3))))

0 голосов
/ 02 ноября 2013

Вы можете определить свою пользовательскую функцию для вычисления суммы переданного ей списка.

(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 голосов
/ 13 мая 2013

машина -> взять первый элемент списка

cdr -> взять все элементы списка, кроме первого элемента

(defun sumup (x) (if (равно x nil) 0 (+ (car x) (sumup (cdr x)))))

(сумма '(5 7 8 10))

30

0 голосов
/ 16 сентября 2011

(eval (cons '+ '(1 2 3))) - хотя и не так хорошо, как «уменьшить»

0 голосов
/ 26 февраля 2009

Это должно сработать:

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

[источник]

Редактировать: Вот еще одна хорошая ссылка , которая объясняет car и cdr - в основном это функции, которые позволяют вам захватить первый элемент списка и получить новый список без первого элемента .

...