Общий Lisp: Почему progn - специальная форма? - программирование
Подтвердить что ты не робот

Общий Lisp: Почему progn - специальная форма?

Так как общие аргументы функции Lisp оцениваются в порядке слева направо, почему бы не использовать обычную функцию:

(defun progn2 (&rest body)
  (first (last body)))

вместо специальной формы?

4b9b3361

Ответ 1

Существует еще одна особенность PROGN, которую вы не можете получить с помощью функции:

Представьте этот код в файле Common Lisp code:

(progn
  (defmacro foo () ))

против.

(my-progn
  (defmacro foo () ))

С помощью PROGN компилятор будет обрабатывать форму DEFMACRO как форму верхнего уровня. Это означает, например, что компилятор отмечает, что существует определение макроса и делает его доступным в среде времени компиляции.

Используя функцию MY-PROGN, компилятор не распознает форму DEFMACRO, потому что она не находится на верхнем уровне.

Ответ 2

progn возвращает все значения последней формы, которую он оценивает, ваша функция возвращает только первую:

(progn (values 1 2 3)) 
=>  1, 2, 3
(progn2 (values 1 2 3)) 
=>  1

Еще одна важная особенность progn (упомянутая Райнером в первую очередь) заключается в том, что она сохраняет все ее формы верхний уровень, что делает его возможно, чтобы макросы расширялись до нескольких форм (см., например, мой ответ на "возвращаемое значение не используется" предупреждение при компиляции макроса".