lambda、 let、 let*、 let-values、 let*-values、 letrec、 letrec* 式や本体部分をともなう定義の <body> は 0 個以上の定義と、それに続くひとつ以上の式から成る
<definition> ... <expression1> <expression2> ...
定義された各識別子は <body> に局所的である。すなわち、その識別子は束縛されていて、束縛の領域が <body> 全体である(R6RS:翻訳:R6RS:5.2 Variables, keywords, and regions 参照)。
例:
(let ((x 5)) (define foo (lambda (y) (bar x y))) (define bar (lambda (a b) (+ (* a b) a))) (foo (+ x 3))) ⇒ 45
begin、 let-syntax、 letrec-sytax フォームが本体中に最初の式より先に現れた場合、それらは本体に継ぎ合わされる。 R6RS:翻訳:R6RS:11.4 Expressions の 11.4.7 節参照。本体のすべてやいくつかが、 begin や let-syntax、 letrec-syntax で括られた部分も含めて、マクロの使用によって規定されることもある(R6RS:翻訳:R6RS:9.2 Macros 参照)。
定義を含む展開された <body> (R6RS:翻訳:R6RS:10 Expansion process 参照)は常に等価な letrec* 式に変換することができる。例えば、上の例の let 式は次と等価である。
(let ((x 5)) (letrec* ((foo (lambda (y) (bar x y))) (bar (lambda (a b) (+ (* a b) a)))) (foo (+ x 3))))