Since Common Lisp's function arguments evaluate in left-to-right order, why wouldn't use an ordinary function:
(defun progn2 (&rest body)
(first (last body)))
instead of special form?
Since Common Lisp's function arguments evaluate in left-to-right order, why wouldn't use an ordinary function:
(defun progn2 (&rest body)
(first (last body)))
instead of special form?
progn
returns all the values of the last form it evaluates, your function returns just the first one:Another critical feature of
progn
(mentioned by Rainer first) is that it keeps all its forms top-level, which makes it possible for macros to expand to multiple forms (see, e.g., my answer to "“value returned is unused” warning when byte-compiling a macro").There is also another feature of
PROGN
which you can't get with a function:Imagine this code in a file of Common Lisp code:
vs.
With using
PROGN
the compiler will treat theDEFMACRO
form as a top-level form. That means for example that the compiler notes that there is a macro definition and makes it available in the compile-time environment.Using a function
MY-PROGN
, the compiler won't recognize theDEFMACRO
form, because it is not at top-level.