let
-формы могут содержать несколько выражений внутри:Как оцениваются let-forms?
(let ((x 4))
x
(+ x 1))
возвращается 5
.
Как оценивается это выражение?
let
-формы могут содержать несколько выражений внутри:Как оцениваются let-forms?
(let ((x 4))
x
(+ x 1))
возвращается 5
.
Как оценивается это выражение?
Ситуация вы описываете происходит в нескольких частей на схеме, а не только в выражении let
. В дальнейшем ...
let
lambda
(и, следовательно, после списка параметров в определении процедуры)cond
... вы можете написать список выражений. Неявно эти выражения заключены в специальную форму begin
, порядок оценки - слева направо, все выражения оцениваются поочередно, но возвращаемое значение - это значение последнего выражения.
Например, это выражение:
(cond ((= 1 1) 1 2 3))
эквивалентно:
(cond ((= 1 1) (begin 1 2 3)))
В обоих случаях возвращается значение 3
, потому что это значение последнего выражения в списке.
, что называется неявной begin
, другими словами, ваш код вычисляется, как если бы оно было написано:
(let ((x 4)) (begin x (+ x 1)))
Хорошо, давайте на всякий случай понятны термины. let
форма состоит из двух частей: привязки и тела:
(let (<zero or more bindings>)
<one or more body expressions>)
Обязывающее имеет форму (<variable> <expression>)
, а тело представляет собой последовательность выражений. A let
оценивается следующим образом:
Во-первых, терминология - выражения после связывания переменных известны как тело, и каждое выражение в теле является выражением тела.Пример:
(let ((variable-1 value-1)
(variable-2 value-2))
body-expression-1
body-expression-2)
Тело выражение завернуты в begin
- (let ((x 2)) x (+ x 1))
таких же, как (let ((x 2)) (begin x (+ x 1)))
.
Выражается каждое выражение тела в begin
, а возвращаемое значение конечного выражения используется как возвращаемое значение для всего тела. Пример: (begin (+ x 1) (+ x 2))
будет оценивать (+ x 1)
и (+ x 2)
, а затем вернуть результат вычисления (+ x 2)
.
Если каждое выражение тела в begin
не имеет побочных эффектов, то все, кроме последнего выражения тела, могут быть удалены без изменения поведения во время выполнения программы. Единственными исключениями здесь являются случаи, когда одно из предварительных выражений тела работает медленно/не возвращает/ошибки - исключение выражения тела устраняет проблему, что является изменением поведения во время выполнения программы.
Однако при использовании функций с побочными эффектами полезно использовать одну или несколько функций для их побочных эффектов, а затем возвращать значение.
http://groups.csail.mit.edu/mac/ftpdir/scheme-7.5/7.5.17/doc-html/scheme_3.html#SEC39 –