Ответ 1
(apply '+ '(1 2 3))
Это работает:
(+ 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
?
(apply '+ '(1 2 3))
Линейно-рекурсивная функция (сумма L)
;;
;; sum
;;
(defun sum(list)
(if (null list)
0
(+
(first list)
(sum (rest list))
)
)
)
Если вы управляете списками и записываете функциональный код в Emacs, установите dash.el
библиотеку. Затем вы можете использовать функцию -sum
:
(-sum '(1 2 3 4 5)) ; => 15
Это должно сделать трюк:
(defun sum-list (list)
(if list
(+ (car list) (sum-list (cdr list)))
0))
Изменить: Вот еще одна хорошая ссылка, которая объясняет car
и cdr
- в основном это функции, которые позволяют вам захватывать первый элемент списка и получить новый список без первого элемента.
Вы можете определить свою пользовательскую функцию для вычисления суммы перечня, переданного ему.
(defun sum (lst) (format t "The sum is ~s~%" (write-to-string (apply '+ lst)))
EVAL: (sum '(1 4 6 4))
-> The sum is "15"
автомобиль → взять первый элемент списка
cdr → взять все элементы списка, кроме первого элемента
(defun sumup (x) (если (равно x nil) 0 (+ (автомобиль x) (sumup (cdr x)))))
(sumup '(5 7 8 10))
30
(eval (cons '+ '(1 2 3)))
- хотя не так хорошо, как "уменьшить"
(insert (number-to-string (применить "+" (1 2 3))))