From: Kevin Ryde <user42@zip.com.au>
Cc: bug-guile@gnu.org
Subject: Re: minor proposed changed to guile doc
Date: Thu, 02 Sep 2004 07:29:24 +1000 [thread overview]
Message-ID: <87n009n0ej.fsf@zip.com.au> (raw)
In-Reply-To: <20040901154937.84224.qmail@web10904.mail.yahoo.com> (first last's message of "Wed, 1 Sep 2004 08:49:37 -0700 (PDT)")
first last <oic2day@yahoo.com> writes:
>
> I propose that the following section replace the
> current documentation for the DO function. It
> essentially replaces "test" with "terminate" and
> "expr" with "result".
I revised `do' per below in the cvs head, perhaps it's clearer.
-- syntax: do ((variable init [step]) ...) (test [expr ...]) body ...
Bind VARIABLEs and evaluate BODY until TEST is true. The return
value is the last EXPR after TEST, if given. A simple example
will illustrate the basic form,
(do ((i 1 (1+ i)))
((> i 4))
(display i))
-| 1234
Or with two variables and a final return value,
(do ((i 1 (1+ i))
(p 3 (* 3 p)))
((> i 4)
p)
(format #t "3**~s is ~s\n" i p))
-|
3**1 is 3
3**2 is 9
3**3 is 27
3**4 is 81
=>
789
The VARIABLE bindings are established like a `let', in that the
expressions are all evaluated and then all bindings made. When
iterating, the optional STEP expressions are evaluated with the
previous bindings in scope, then new bindings all made.
The TEST expression is a termination condition. Looping stops
when the TEST is true. It's evaluated before running the BODY
each time, so if it's true the first time then BODY is not run at
all.
The optional EXPRs after the TEST are evaluated at the end of
looping, with the final VARIABLE bindings available. The last
EXPR gives the return value, or if there are no EXPRs the return
value is unspecified.
Each iteration establishes bindings to fresh locations for the
VARIABLEs, like a new `let' for each iteration. This is done for
VARIABLEs without STEP expressions too. The following illustrates
this, showing how a new `i' is captured by the `lambda' in each
iteration (*note The Concept of Closure: About Closure.).
(define lst '())
(do ((i 1 (1+ i)))
((> i 4))
(set! lst (cons (lambda () i) lst)))
(map (lambda (proc) (proc)) lst)
=>
(4 3 2 1)
_______________________________________________
Bug-guile mailing list
Bug-guile@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-guile
prev parent reply other threads:[~2004-09-01 21:29 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-01 15:49 minor proposed changed to guile doc first last
2004-09-01 21:29 ` Kevin Ryde [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87n009n0ej.fsf@zip.com.au \
--to=user42@zip.com.au \
--cc=bug-guile@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).