Rozumiem różnicę między LET i LET * (wiązanie równoległe i sekwencyjne) i jako kwestia teoretyczna ma to doskonały sens. Ale czy jest jakiś przypadek, w którym kiedykolwiek potrzebowałeś LET? W całym moim kodzie Lispa, który ostatnio przeglądałem, możesz zamienić każdy LET na LET * bez zmian.
Edycja: OK, rozumiem, dlaczego jakiś facet wymyślił LET *, prawdopodobnie jako makro, dawno temu. Moje pytanie brzmi, biorąc pod uwagę, że LET * istnieje, czy jest powód, dla którego LET ma pozostać? Czy napisałeś jakiś rzeczywisty kod Lispa, w którym LET * nie działałby tak dobrze, jak zwykły LET?
Nie kupuję argumentu wydajności. Po pierwsze, rozpoznawanie przypadków, w których LET * można skompilować w coś tak wydajnego jak LET, po prostu nie wydaje się takie trudne. Po drugie, w specyfikacji CL jest wiele rzeczy, które po prostu nie wydają się być zaprojektowane z myślą o wydajności. (Kiedy ostatnio widziałeś LOOP z deklaracjami typu? Tak trudno to rozgryźć, że nigdy ich nie widziałem.) Przed testami porównawczymi Dicka Gabriela z późnych lat osiemdziesiątych, CL było po prostu powolne.
Wygląda na to, że jest to kolejny przypadek wstecznej kompatybilności: mądrze, nikt nie chciał ryzykować złamania czegoś tak fundamentalnego jak LET. Takie było moje przeczucie, ale pocieszające jest usłyszeć, że nikt nie ma głupio prostego przypadku, którego mi brakowało, w którym LET sprawiło, że wiele rzeczy było śmiesznie łatwiejszych niż LET *.