Entiendo la diferencia entre LET y LET * (enlace paralelo versus secuencial), y como cuestión teórica tiene perfecto sentido. Pero, ¿hay algún caso en el que alguna vez hayas necesitado LET? En todo mi código Lisp que he visto recientemente, puede reemplazar cada LET con LET * sin cambios.LET versus LET * en Common Lisp
Edit: OK, entiendo por qué algún tipo inventó LET *, presumiblemente como una macro, hace mucho tiempo. Mi pregunta es, dado que LET * existe, ¿hay alguna razón para que LET permanezca? ¿Has escrito algún código Lisp real donde un LET * no funcione tan bien como un LET simple?
No compro el argumento de la eficiencia. En primer lugar, reconocer los casos donde LET * se puede compilar en algo tan eficiente como LET simplemente no parece tan difícil. En segundo lugar, hay muchas cosas en las especificaciones de CL que simplemente no parecen haber sido diseñadas en términos de eficiencia en absoluto. (¿Cuándo fue la última vez que vio un LOOP con declaraciones de tipo? Es tan difícil imaginar 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. Cuál fue mi corazonada, pero es reconfortante saber que nadie tiene un caso estúpidamente simple que me faltaba donde DEJAR hizo un montón de cosas ridículamente más fácil que LET *.
paralelo es una mala elección de palabras; solo enlaces anteriores son visibles. la unión paralela se parecería más a las uniones "... donde ..." de Haskell. – jrockway
No intenté confundir; Creo que esas son las palabras usadas por la especificación. :-) – Ken
Paralelo es correcto. Significa que los enlaces cobran vida al mismo tiempo y no se ven y no se ensombrecen. En ningún momento existe un entorno visible para el usuario que incluya algunas de las variables definidas en el LET, pero no en otras. – Kaz