这个可行:
(+ 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))
;;
;; sum
;;
(defun sum(list)
(if (null list)
0
(+
(first list)
(sum (rest list))
)
)
)
(defun sum (lst) (format t "The sum is ~s~%" (write-to-string (apply '+ lst)))
EVAL: (sum '(1 4 6 4))
-> The sum is "15"
(defun sum-list (list)
(if list
(+ (car list) (sum-list (cdr list)))
0))
编辑:这里有另一个好的链接,解释了car
和cdr
- 基本上它们是允许您获取列表的第一个元素并检索新列表的函数,不包括第一个项目。
(insert (number-to-string (apply '+ '(1 2 3))))
(插入(数字转字符串(应用 '+' '(1 2 3))))
(eval (cons '+ '(1 2 3)))
-- 虽然不如 'reduce' 好用