DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(guile.info.gz) Internal Definitions

Info Catalog (guile.info.gz) Local Bindings (guile.info.gz) Binding Constructs (guile.info.gz) Binding Reflection
 
 25.3 Internal definitions
 =========================
 
 A `define' form which appears inside the body of a `lambda', `let',
 `let*', `letrec' or equivalent expression is called an "internal
 definition".  An internal definition differs from a top level
 definition ( Top Level), because the definition is only visible
 inside the complete body of the enclosing form.  Let us examine the
 following example.
 
      (let ((frumble "froz"))
         (define banana (lambda () (apple 'peach)))
         (define apple (lambda (x) x))
         (banana))
      =>
      peach
 
    Here the enclosing form is a `let', so the `define's in the
 `let'-body are internal definitions.  Because the scope of the internal
 definitions is the *complete* body of the `let'-expression, the
 `lambda'-expression which gets bound to the variable `banana' may refer
 to the variable `apple', even though it's definition appears lexically
 _after_ the definition of `banana'.  This is because a sequence of
 internal definition acts as if it were a `letrec' expression.
 
      (let ()
        (define a 1)
        (define b 2)
        (+ a b))
 
 is equivalent to
 
      (let ()
        (letrec ((a 1) (b 2))
          (+ a b)))
 
    Another noteworthy difference to top level definitions is that within
 one group of internal definitions all variable names must be distinct.
 That means where on the top level a second define for a given variable
 acts like a `set!', an exception is thrown for internal definitions
 with duplicate bindings.
 
Info Catalog (guile.info.gz) Local Bindings (guile.info.gz) Binding Constructs (guile.info.gz) Binding Reflection
automatically generated byinfo2html