Entiendo la diferencia entre LET y LET * (enlace paralelo versus secuencial) y, como cuestión teórica, tiene mucho sentido. Pero, ¿hay algún caso en el que alguna vez hayas necesitado LET? En todo mi código Lisp que he visto recientemente, podría reemplazar cada LET con LET * sin cambios.
Editar: OK, entiendo por qué un tipo inventó LET *, presumiblemente como una macro, hace mucho tiempo. Mi pregunta es, dado que LET * existe, ¿hay alguna razón para que LET se quede? ¿Ha escrito algún código Lisp real donde un LET * no funcionaría tan bien como un LET simple?
No compro el argumento de la eficiencia. Primero, reconocer los casos en los que LET * se puede compilar en algo tan eficiente como LET no parece tan difícil. En segundo lugar, hay muchas cosas en la especificación CL que simplemente no parecen haber sido diseñadas en función de la eficiencia. (¿Cuándo fue la última vez que vio un LOOP con declaraciones de tipos? Son tan difíciles de entender que nunca los había visto usar). Antes de los puntos de referencia de Dick Gabriel de finales de los 80, CL era francamente lento.
Parece que este es otro caso de compatibilidad con versiones anteriores: sabiamente, nadie quería arriesgarse a romper algo tan fundamental como LET. Esa fue mi corazonada, pero es reconfortante escuchar que nadie tiene un caso estúpidamente simple que me faltaba donde LET hizo un montón de cosas ridículamente más fáciles que LET *.