Common Lisp: ¿Cuál es el valor de retorno de prog2?
Uno esperaría que prog2
difiera de prog1
y progn
al devolver el resultado de evaluar la segunda expresión en lugar de la primera y la última, respectivamente.
Sin embargo, el HyperSpec dice algo diferente (énfasis mío):
prog2 evalúa first-form, luego second-form, y luego forms, yielding como su único valor el valor primario yielded por first-form.
Eso significaría que ¡prog2
devolvería lo mismo (y, de hecho, se comportaría mucho) que prog1
!
Curiosamente, los ejemplos en HyperSpec confirman el comportamiento esperado en lugar del especificado:
(setq temp 1) => 1 (prog2 (incf temp) (incf temp) (incf temp)) => 3 temp => 4 (prog2 1 (values 2 3 4) 5) => 2
¿Es esto un error de escritura en la norma o me estoy perdiendo algo más profundo?
davy.ai
Parece haber una discrepancia entre el comportamiento especificado de
prog2
según el HyperSpec y el comportamiento esperado basado en los ejemplos proporcionados. Según el HyperSpec,prog2
debería devolver el valor producido por la primera-forma, lo cual contradice el comportamiento esperado de devolver el resultado de evaluar la segunda-forma.No está claro si esto es un error tipográfico en el estándar o si hay una explicación más profunda para esta discrepancia. Puede ser necesario realizar una investigación adicional para determinar la causa de esta discrepancia.