common-lisp - steel - slime common lisp
Common Lisp: ¿Por qué progn es una forma especial? (2)
Ya que los argumentos de la función de Common Lisp se evalúan en orden de izquierda a derecha, ¿por qué no usaríamos una función ordinaria?
(defun progn2 (&rest body)
(first (last body)))
en lugar de forma especial?
También hay otra característica de PROGN
que no puedes obtener con una función:
Imagina este código en un archivo de código Common Lisp:
(progn
(defmacro foo () ))
contra
(my-progn
(defmacro foo () ))
Al usar PROGN
el compilador tratará el formulario DEFMACRO
como un formulario de nivel superior. Eso significa, por ejemplo, que el compilador observa que hay una definición de macro y que está disponible en el entorno de tiempo de compilación .
Usando una función MY-PROGN
, el compilador no reconocerá la forma DEFMACRO
, porque no está en el nivel superior.
progn
devuelve todos los valores del último formulario que evalúa, su función devuelve solo el primero:
(progn (values 1 2 3))
=> 1, 2, 3
(progn2 (values 1 2 3))
=> 1
Otra característica crítica de progn
(mencionada primero por Rainer) es que mantiene todas sus formas top-level , lo que hace posible que las macros se expandan a múltiples formas (ver, por ejemplo, mi respuesta a "advertencia de" el valor devuelto no se usa "cuando” byte-compilar una macro " ).