From: Andy Wingo <wingo@pobox.com>
To: "Hans Åberg" <hans.aberg-1@telia.com>
Cc: bug-guile@gnu.org
Subject: Re: GIT version: values
Date: Wed, 26 Jan 2011 21:51:08 +0100 [thread overview]
Message-ID: <m3vd1bcrsz.fsf@unquote.localdomain> (raw)
In-Reply-To: <162CAAE3-D2D8-4894-9B9F-3397348DCFA2@telia.com> ("Hans Åberg"'s message of "Wed, 19 Jan 2011 15:44:24 +0100")
Hi Hans,
Thanks for porting to the 1.9 development series!
On Wed 19 Jan 2011 15:44, Hans Åberg <hans.aberg-1@telia.com> writes:
> It seems it is not only 'values' writing, but the new behavior seems to
> be to strip trailing values quietly:
> (define a (values 2 3 4))
> (call-with-values (lambda () a) (lambda x x))
> in Guile 1.9.14.68-a7d8a computes to
> $1 = (2)
>
> By contrast, in guile-1.8.8, it computes to
> (2 3 4)
Indeed. This and a (hopefully small) number of other differences are
noted in the NEWS. In this case:
** Returning multiple values to compiled code will silently truncate the
values to the expected number
For example, the interpreter would raise an error evaluating the form,
`(+ (values 1 2) (values 3 4))', because it would see the operands as
being two compound "values" objects, to which `+' does not apply.
The compiler, on the other hand, receives multiple values on the stack,
not as a compound object. Given that it must check the number of values
anyway, if too many values are provided for a continuation, it chooses
to truncate those values, effectively evaluating `(+ 1 3)' instead.
The idea is that the semantics that the compiler implements is more
intuitive, and the use of the interpreter will fade out with time.
This behavior is allowed both by the R5RS and the R6RS.
** Multiple values in compiled code are not represented by compound
objects
This change may manifest itself in the following situation:
(let ((val (foo))) (do-something) val)
In the interpreter, if `foo' returns multiple values, multiple values
are produced from the `let' expression. In the compiler, those values
are truncated to the first value, and that first value is returned. In
the compiler, if `foo' returns no values, an error will be raised, while
the interpreter would proceed.
Both of these behaviors are allowed by R5RS and R6RS. The compiler's
behavior is more correct, however. If you wish to preserve a potentially
multiply-valued return, you will need to set up a multiple-value
continuation, using `call-with-values'.
There is no tuple with multiple-valued returns: they are returned on the
stack.
Regards,
Andy
--
http://wingolog.org/
next prev parent reply other threads:[~2011-01-26 20:51 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-18 9:57 GIT version: values writing Hans Aberg
2011-01-19 14:44 ` GIT version: values Hans Åberg
2011-01-26 20:51 ` Andy Wingo [this message]
2011-01-26 23:34 ` Hans Aberg
2011-01-27 9:00 ` Andy Wingo
2011-01-27 13:20 ` Hans Aberg
2011-01-19 17:05 ` Hans Aberg
2011-01-20 15:17 ` Ludovic Courtès
2011-01-20 17:10 ` Hans Aberg
2011-01-19 19:40 ` GIT version: segmentation fault Hans Aberg
2011-01-26 20:46 ` Andy Wingo
2011-01-26 23:37 ` Hans Aberg
2011-01-19 22:22 ` GIT version: missing linking flag Hans Aberg
2011-01-20 15:20 ` Ludovic Courtès
2011-01-20 17:03 ` Hans Aberg
2011-01-20 21:01 ` Ludovic Courtès
2011-01-20 21:13 ` Hans Aberg
2011-01-21 16:02 ` Ludovic Courtès
2011-01-21 17:59 ` Hans Aberg
2011-01-26 20:52 ` Andy Wingo
2011-01-26 23:44 ` Hans Aberg
2011-01-29 21:47 ` Ludovic Courtès
2011-01-29 22:51 ` Hans Aberg
2011-01-26 20:55 ` Andy Wingo
2011-01-26 23:47 ` Hans Aberg
2011-01-20 15:16 ` GIT version: values writing Ludovic Courtès
2011-01-20 16:51 ` Hans Aberg
2011-01-20 21:18 ` Ludovic Courtès
2011-01-20 21:55 ` Hans Aberg
2011-01-21 17:13 ` Values extension Hans Aberg
2011-01-26 20:57 ` GIT version: values writing Andy Wingo
2011-01-26 23:50 ` Hans Aberg
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=m3vd1bcrsz.fsf@unquote.localdomain \
--to=wingo@pobox.com \
--cc=bug-guile@gnu.org \
--cc=hans.aberg-1@telia.com \
/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).