tutorial steel for common common-lisp

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 " ).