LET
сам по себе не является настоящим примитивом в Функциональном языке программирования , поскольку его можно заменить на LAMBDA
. Как это:
(let ((a1 b1) (a2 b2) ... (an bn))
(some-code a1 a2 ... an))
похож на
((lambda (a1 a2 ... an)
(some-code a1 a2 ... an))
b1 b2 ... bn)
Но
(let* ((a1 b1) (a2 b2) ... (an bn))
(some-code a1 a2 ... an))
похож на
((lambda (a1)
((lambda (a2)
...
((lambda (an)
(some-code a1 a2 ... an))
bn))
b2))
b1)
Вы можете себе представить, что проще. LET
, а не LET*
.
LET
облегчает понимание кода. Каждый видит кучу привязок, и каждый может читать каждую привязку индивидуально без необходимости понимать нисходящий / левый-правый поток «эффектов» (повторных привязок). Использование LET*
сигнализирует программисту (тот, который читает код), что привязки не являются независимыми, но есть некоторый нисходящий поток - который усложняет вещи.
В Common Lisp есть правило, что значения для привязок в LET
вычисляются слева направо. Как оцениваются значения для вызова функции - слева направо. Итак, LET
является концептуально более простым утверждением, и его следует использовать по умолчанию.
Типы в LOOP
? Используются довольно часто. Есть несколько примитивных форм объявления типов, которые легко запомнить. Пример: * +1032 *
(LOOP FOR i FIXNUM BELOW (TRUNCATE n 2) do (something i))
Выше объявляется, что переменная i
является fixnum
.
Ричард П. Габриэль опубликовал свою книгу о тестах Lisp в 1985 году, и в то время эти тесты также использовались с Lisp без CL. Сам Common Lisp был совершенно новым в 1985 году - книга CLtL1 , в которой описывался язык, была только что опубликована в 1984 году. Неудивительно, что в то время реализации были не очень оптимизированы. Внедренные оптимизации были в основном такими же (или менее), что и предыдущие реализации (например, MacLisp).
Но для LET
против LET*
основное отличие состоит в том, что код, использующий LET
, легче понять для людей, поскольку пункты связывания независимы друг от друга - тем более, что использовать преимущества в плохом стиле оценка слева направо (не устанавливая переменные как побочный эффект).