2012-02-22 4 views

ответ

2

Ситуация вы описываете происходит в нескольких частей на схеме, а не только в выражении let. В дальнейшем ...

  • После того, как список привязок переменных в выражении let
  • После того, как список параметров в выражении lambda (и, следовательно, после списка параметров в определении процедуры)
  • После каждого предложения в выражении cond

... вы можете написать список выражений. Неявно эти выражения заключены в специальную форму begin, порядок оценки - слева направо, все выражения оцениваются поочередно, но возвращаемое значение - это значение последнего выражения.

Например, это выражение:

(cond ((= 1 1) 1 2 3)) 

эквивалентно:

(cond ((= 1 1) (begin 1 2 3))) 

В обоих случаях возвращается значение 3, потому что это значение последнего выражения в списке.

8

, что называется неявной begin, другими словами, ваш код вычисляется, как если бы оно было написано:

(let ((x 4)) (begin x (+ x 1))) 
+0

http://groups.csail.mit.edu/mac/ftpdir/scheme-7.5/7.5.17/doc-html/scheme_3.html#SEC39 –

4

Хорошо, давайте на всякий случай понятны термины. let форма состоит из двух частей: привязки и тела:

(let (<zero or more bindings>) 
    <one or more body expressions>) 

Обязывающее имеет форму (<variable> <expression>), а тело представляет собой последовательность выражений. A let оценивается следующим образом:

  • Создайте локальную среду, в которой каждая переменная привязана к результату оценки выражения в соответствующей привязке.
  • Оцените выражения в теле в последовательном порядке.
  • Результат: последнее выражение в теле.
1

Во-первых, терминология - выражения после связывания переменных известны как тело, и каждое выражение в теле является выражением тела.Пример:

(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 не имеет побочных эффектов, то все, кроме последнего выражения тела, могут быть удалены без изменения поведения во время выполнения программы. Единственными исключениями здесь являются случаи, когда одно из предварительных выражений тела работает медленно/не возвращает/ошибки - исключение выражения тела устраняет проблему, что является изменением поведения во время выполнения программы.

Однако при использовании функций с побочными эффектами полезно использовать одну или несколько функций для их побочных эффектов, а затем возвращать значение.

Смежные вопросы