[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: vm-error: guile-gnome-2 / treeview / 'button-press-event
From: |
Andy Wingo |
Subject: |
Re: vm-error: guile-gnome-2 / treeview / 'button-press-event |
Date: |
Thu, 14 Jul 2011 11:07:10 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) |
Hi David,
On Sat 09 Jul 2011 08:51, David Pirotte <address@hidden> writes:
> Too few values returned to continuation
> (let* ([...]
> (path-values ;; (get-path-at-pos w x-pos y-pos)
> (values (list 1) #t 10 10)
> ))
The problem is here. From the NEWS:
** 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'.
(It is no longer true that the interpreter and the compiler behave
differently; they behave the same.)
Anyway, if you want a compound values object, use "list", then in your
values-producing expression
> (receive (indices bool x y)
> path-values
use (apply values my-list).
Regards,
Andy
--
http://wingolog.org/