R6RS:翻訳:R6RS:11.3 Bodies

R6RS:翻訳:R6RS:11.3 Bodies

11.3 本体部分

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))))

Last modified : 2008/03/31 16:40:31 UTC