|
Subject: Re: [dssslist] in reply to: "define inside let body" From: tmcd@xxxxxxxxx Date: Wed, 9 Feb 2005 13:00:34 -0600 (CST) |
> >Hi, I am trying to understand the dsssl standard document
> >(ISO/IEC 10179:1996(E). Trying to put this example to work with
> >openjade, part 8.4 "Definitions" of the document, at top level:
> >
> >(define p
> > (let ((x 5))
> > (define foo (lambda (y) (bar x y)))
> > (define bar (lambda (a b) (+ (* a b) a)))
> > (foo (+ x 3)))
> >)
>
> Hi,
> I'am rather inexperienced but I'll try to answer.
> The former should look like:
The example above is right out of the DSSSL spec, page 43. I don't
have a net connection right now, btu I suspect that Googling for
"dsssl96b.pdf" would find it. Look for "dsssl96f.pdf" too: it's the
table of contents.
> (define p
> (let ((x 5)
> (foo (lambda (y) (bar x y)))
> (bar (lambda (a b) (+ (* a b) a))))
> (foo (+ x 3)))
> )
>
> It won't work anyway because of recursive definitions, but now at
> least it should be accepted by jade.
See "NOTE 9" quoted below. I'm not sure that it won't work, but I
haven't tried it. In any event, "letrec", which was mentioned as the
equivalent expansion, makes it work.
> >According the standard. body is described (in the same page) as
> >
> > [69] body=definition* expression
>
> In your code you repeat expression part 3 times, so it is not very
> correct.
The BNF listed on pages 42 and 43 are
[66] definition = variable-definition | procedure-definition
Definitions may take two possible forms.
[67] variable-definition = (define variable expression)
This syntax is primitive.
[68] procedure-definition = (define (variable formal-argument-list) body)
This form is equivalent to
(define variable
(lambda (variable formal-argument-list) body)).
A definition that does not occur within an expression is known as
a top-level definition.
A top-level definition
(define variable expression)
evaluates expression in the top-level environment and binds
variable to the result in the top-level environment.
The expression in a top-level definition shall not be evaluated
until all top-level variables that would be referenced by
evaluating the expression have been defined.
NOTE 9 This constraint does not prevent the definition of mutually
recursive procedures, because evaluating a lambda expression does
not reference variables that occur free within it.
It shall be an error if it is impossible to evaluate all the
expressions occurring in top-level definitions in such a way that
this constraint is not violated. ...
[69] body = definition* expression
Definitions may also occur at the beginning of a body. These are
known as internal definitions. The variable defined by an internal
definition is local to the body. The region of the binding is the
entire body. For example,
(let ((x 5))
(define foo (lambda (y) (bar x y)))
(define bar (lambda (a b) (+ (* a b) a)))
(foo (+ x 3))) => 45
So in that example, "definition" is repeated 2 times:
1: (define foo (lambda (y) (bar x y)))
2: (define bar (lambda (a b) (+ (* a b) a)))
and expression appears once:
(foo (+ x 3)))
It's a bit of a pity that OpenJade doesn't allow it: I could have
gotten rid of a few "let" blocks that way. If it allowed definitions
before any _expression_ (extending the standard), a LOT of "let"
blocks would go away. Still, it's easy enough to work around.
--
Tim McDaniel; Reply-To: tmcd@xxxxxxxxx
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [dssslist] in reply to: "define ins, tgrzej | Thread | Re: [dssslist] in reply to: "define, Joaquín Zuazo |
| [dssslist] in reply to: "define ins, tgrzej | Date | Re: [dssslist] in reply to: "define, Joaquín Zuazo |
| Month |