[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Internal definitions as a combination of LETREC's and LET*'s.

In article <41415@linus.UUCP> ramsdell@linus.UUCP (John D. Ramsdell) writes:
>Yet at top level, it is okay to define values in terms of other
>definitions.  An obvious way of making internal definitions behave
>more like top level definitions, is to specify the order in which the
>init bodies are evaluated.  I call this interpretation internal
>definitions as a combination of LETREC's and LET*'s; a definition
>becomes equivalent to the following combinations of LET's and SET!'s:
>(LET ()
>  (DEFINE <var-0> <init-0>)
>            ...
>  (DEFINE <var-n> <init-n>)
>  <body>)
>         ==>
>(LET ((<var-0> <undefined>)
>             ...
>      (<var-n> <undefined>))
>  (SET! <var-0> <init-0>)		; init's must be evaluated
>          ...				; in the order presented.
>  (SET! <var-n> <init-n>)
>  <body>)

Here's one possible problem, at least with the suggested expansion:

               (define x 5)

               (let ()
                 (define y x)
                 (define x 'any)

Then wouldn't the result be unspecified, even though the intuitive
answer is 5? 

-- Brad Pierce

P.S. Something else I'm curious about...

Also, is one allowed to declare the same identifier more than once in the same
lambda closure in official Scheme? The Scheme I am currently using doesn't give
an error message when I try to do this:  ((lambda (x x) x) 1 2) 

And is it officially legal to "define" something more than once at top level.
The reason that I ask is that the expansion looks a little shaky in the case
that one would re"define" an identifier in such a clause.