Я понимаю разницу между LET и LET * (параллельная или последовательная привязка), и в качестве теоретического вопроса это имеет смысл. Но есть ли случаи, когда вы когда-либо нуждались в LET? Во всем моем коде Lisp, который я недавно просмотрел, вы можете заменить каждый LET с помощью LET * без изменений.
Изменить: Хорошо, я понимаю, почему какой-то парень изобрел LET *, предположительно как макрос, назад. Мой вопрос заключается в том, что LET * существует, есть ли причина, по которой LET может остаться? Вы написали какой-либо фактический код Lisp, где LET * не будет работать, а также простой LET?
Я не покупаю аргумент эффективности. Во-первых, распознавание случаев, когда LET * можно скомпилировать во что-то столь же эффективное, как LET, просто не кажется таким трудным. Во-вторых, в спецификации CL есть много вещей, которые просто не кажутся такими, что они были разработаны вокруг эффективности вообще. (Когда в последний раз вы видели LOOP с объявлениями типа? Те, кого так трудно понять, я никогда не видел, чтобы они использовались.) До тестов Дика Габриэля конца 1980-х годов CL был довольно медленным.
Похоже, что это еще один случай обратной совместимости: разумно, никто не хотел рисковать сломать что-то столь же фундаментальное, как LET. Это была моя догадка, но мне было приятно услышать, что у кого-то есть глупо-простой случай, который мне не хватало, где LET делал кучу вещей смехотворно легче, чем LET *.