На основе их можно определить макросы уже без побочных эффектов:
(defmacro +. (frst &rest rst)
`(let ((result ,frst)) (=+ result ,@rst)))(defmacro *. (frst &rest rst)
`(let ((result ,frst)) (=* result ,@rst)))(+. 1 2 "3" "0.001") (+. "str " 2 3 "0.001") (+. '(1 2 3) 4 5 "0.001") О точке - она не просто, чтобы не путаться с обычными + и *, а значит примерно вот что - в ruby или python любая переменная/константа это объект определенного типа (точнее экземпляры), и любые функции для них мыслятся как методы. Например - 7 + 8 + 9 на самом деле вычисляется как 7.+(8.+(9)). Объект слева, метод справа и между ними точка. В Лисп наоборот объект (первый аргумент) справа, а метод (функция) - слева, и между ними я ставлю точку.
Теперь если ещё добавить
(defun range (a b)
(let ((result nil))
(dotimes (i (1+ (- b a)))
(push (+ a i) result))
(nreverse result)))(range 1 5) то можно определить факториал, например так:
(defmacro fact (n)
`(progn
(setf *MAX-RECURSION* (* *O-RECURSIVE-COEFF* (exp n)))
(*. ,@(range 1 n))))(fact 1000000)