Так как общие аргументы функции Lisp оцениваются в порядке слева направо, почему бы не использовать обычную функцию:
(defun progn2 (&rest body)
(first (last body)))
вместо специальной формы?
Ответ 1
Существует еще одна особенность PROGN, которую вы не можете получить с помощью функции:
Представьте этот код в файле Common Lisp code:
(progn
(defmacro foo () ))
против.
(my-progn
(defmacro foo () ))
С помощью PROGN компилятор будет обрабатывать форму DEFMACRO как форму верхнего уровня. Это означает, например, что компилятор отмечает, что существует определение макроса и делает его доступным в среде времени компиляции.
Используя функцию MY-PROGN, компилятор не распознает форму DEFMACRO, потому что она не находится на верхнем уровне.
Ответ 2
progn возвращает все значения последней формы, которую он оценивает, ваша функция возвращает только первую: