Используйте интерфейсы, когда реализации той же функциональности будут отличаться.
Использование краткий обзор/базовые классы, когда необходимо совместно использовать общую конкретную реализацию.
Вам необходимо привязать переменную 'result' - например, с помощью 'let' - перед тем, как начать ее использовать:
(defun it-fact(num)
(let ((result 1))
(dotimes (i num)
(setf result (* result (+ i 1))))))
Для получения более подробной информации вы можете прочитать this ...
Есть несколько ошибок или не очень хорошего стиля Lisp:
(defun it-fact(num) ; style: use a space before (
(setf result 1) ; bad: variable RESULT is not introduced
(dotimes (i num)
(setf result (* result (+ i 1))) ; bad: extra addition in each iteration
) ; style: parentheses on a single line
) ; bad: no useful return value
Возможная версия:
(defun it-fact (num)
(let ((result 1)) ; local variable introduced with LET
(loop for i from 1 upto num ; I starts with 1, no extra addition
do (setf result (* result i)))
result)) ; result gets returned from the LET
В Лиспе локальные переменные должны быть явно объявлены с помощью LET или других форм, которые создают локальные переменные. Это отличается от, например, Python или JavaScript, где присвоение переменной создает переменную в текущей лексической области.
Ваш пример можно переписать следующим образом:
(defun it-fact(num)
(let ((result 1))
(dotimes (i num)
(setf result (* result (+ i 1))))))
Комментарий не по теме: нет смысла помещать закрывающие круглые скобки в отдельные строки .