Подтвердить что ты не робот

Как суммировать список номеров в Emacs Lisp?

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

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

4b9b3361

Ответ 1

(apply '+ '(1 2 3))

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Это должно сделать трюк:

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

[источник]

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

Ответ 5

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

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

Ответ 6

автомобиль → взять первый элемент списка

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

(defun sumup (x) (если (равно x nil) 0 (+ (автомобиль x) (sumup (cdr x)))))

(sumup '(5 7 8 10))

30

Ответ 7

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

Ответ 8

(insert (number-to-string (применить "+" (1 2 3))))