* GIT version: values writing
@ 2011-01-18 9:57 Hans Aberg
2011-01-19 14:44 ` GIT version: values Hans Åberg
` (4 more replies)
0 siblings, 5 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-18 9:57 UTC (permalink / raw)
To: bug-guile
There seems to be a bug in GIT version when writing the 'values' data
type.
(list 2 (values 3 4) 5)
$1 = (2 3 5)
with the value 4 lost In guile-1.8.8, it would write
(2 #<values 3 4> 5)
The top level write out all values:
(values 3 4)
$2 = 3
$3 = 4
The values correspond to tuples, so they might be written out as
ordinary tuples, though that is perhaps not Scheme style.
^ permalink raw reply [flat|nested] 32+ messages in thread
* GIT version: values
2011-01-18 9:57 GIT version: values writing Hans Aberg
@ 2011-01-19 14:44 ` Hans Åberg
2011-01-26 20:51 ` Andy Wingo
2011-01-19 17:05 ` Hans Aberg
` (3 subsequent siblings)
4 siblings, 1 reply; 32+ messages in thread
From: Hans Åberg @ 2011-01-19 14:44 UTC (permalink / raw)
To: bug-guile
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)
^ permalink raw reply [flat|nested] 32+ messages in thread
* GIT version: values
2011-01-18 9:57 GIT version: values writing Hans Aberg
2011-01-19 14:44 ` GIT version: values Hans Åberg
@ 2011-01-19 17:05 ` Hans Aberg
2011-01-20 15:17 ` Ludovic Courtès
2011-01-19 19:40 ` GIT version: segmentation fault Hans Aberg
` (2 subsequent siblings)
4 siblings, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-19 17:05 UTC (permalink / raw)
To: bug-guile
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)
^ permalink raw reply [flat|nested] 32+ messages in thread
* GIT version: segmentation fault
2011-01-18 9:57 GIT version: values writing Hans Aberg
2011-01-19 14:44 ` GIT version: values Hans Åberg
2011-01-19 17:05 ` Hans Aberg
@ 2011-01-19 19:40 ` Hans Aberg
2011-01-26 20:46 ` Andy Wingo
2011-01-19 22:22 ` GIT version: missing linking flag Hans Aberg
2011-01-20 15:16 ` GIT version: values writing Ludovic Courtès
4 siblings, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-19 19:40 UTC (permalink / raw)
To: bug-guile
The code below causes Guile 1.9.14.68-a7d8a to crash (segmentation
fault after awhile), on Mac OS X 10.5.8 PPC G4.
(defmacro call (f g)
`(apply ,g (,f)))
(call (lambda () (values 4 5))
(lambda (a b) b))
^ permalink raw reply [flat|nested] 32+ messages in thread
* GIT version: missing linking flag
2011-01-18 9:57 GIT version: values writing Hans Aberg
` (2 preceding siblings ...)
2011-01-19 19:40 ` GIT version: segmentation fault Hans Aberg
@ 2011-01-19 22:22 ` Hans Aberg
2011-01-20 15:20 ` Ludovic Courtès
2011-01-20 15:16 ` GIT version: values writing Ludovic Courtès
4 siblings, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-19 22:22 UTC (permalink / raw)
To: bug-guile
In 'guile-config link', the flag '-lgc' is missing; it is needed when
linking smobs. The function SCM_NEWSMOB calls
GC_register_finalizer_no_order() in header gc.h
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
2011-01-18 9:57 GIT version: values writing Hans Aberg
` (3 preceding siblings ...)
2011-01-19 22:22 ` GIT version: missing linking flag Hans Aberg
@ 2011-01-20 15:16 ` Ludovic Courtès
2011-01-20 16:51 ` Hans Aberg
4 siblings, 1 reply; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-20 15:16 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hi Hans,
Hans Aberg <haberg-1@telia.com> writes:
> There seems to be a bug in GIT version when writing the 'values' data
> type.
> (list 2 (values 3 4) 5)
> $1 = (2 3 5)
This behavior is correct: in Guile 1.9, multiple-value returns are
truncated any time the continuation expects fewer values.
Here, the ‘values’ call returns 3 values, but the location where it’s
called expects only 1, hence the automatic truncation.
> with the value 4 lost In guile-1.8.8, it would write
> (2 #<values 3 4> 5)
The special “values” type in older Guile versions was an artifact of
Guile’s implementation of multiple value support; objects of that type
are normally invisible to user code, but they would show up in such
situations (R5RS doesn’t specify what to do in these cases, so it was
valid, but implementation-specific behavior.)
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-19 17:05 ` Hans Aberg
@ 2011-01-20 15:17 ` Ludovic Courtès
2011-01-20 17:10 ` Hans Aberg
0 siblings, 1 reply; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-20 15:17 UTC (permalink / raw)
To: bug-guile
Hi,
Hans Aberg <haberg-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)
This is the same problem as in your other message.
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
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
0 siblings, 1 reply; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-20 15:20 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hi!
Hans Aberg <haberg-1@telia.com> writes:
> In 'guile-config link', the flag '-lgc' is missing; it is needed when
> linking smobs. The function SCM_NEWSMOB calls
> GC_register_finalizer_no_order() in header gc.h
It shouldn’t be needed when libguile is a shared library, at least not
on ELF platforms where the shared library contains ‘NEEDED’ headers.
It is needed when libguile is static, but in that case you should use
‘pkg-config guile-2.0 --libs --static’ (‘guile-config’ is deprecated.)
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
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-26 20:57 ` GIT version: values writing Andy Wingo
0 siblings, 2 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-20 16:51 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 16:16, Ludovic Courtès wrote:
>> There seems to be a bug in GIT version when writing the 'values' data
>> type.
>> (list 2 (values 3 4) 5)
>> $1 = (2 3 5)
>
> This behavior is correct: in Guile 1.9, multiple-value returns are
> truncated any time the continuation expects fewer values.
>
> Here, the ‘values’ call returns 3 values, but the location where it’s
> called expects only 1, hence the automatic truncation.
After the post, I saw that R5RS says the behavior is undefined.
However, quietly loosing values is inviting bugs.
>> with the value 4 lost In guile-1.8.8, it would write
>> (2 #<values 3 4> 5)
>
> The special “values” type in older Guile versions was an artifact of
> Guile’s implementation of multiple value support; objects of that type
> are normally invisible to user code, but they would show up in such
> situations (R5RS doesn’t specify what to do in these cases, so it was
> valid, but implementation-specific behavior.)
The old style is a reification of the values, and could be turned into
a tuples object. The latter is what I am implementing, but I can make
my own type instead.
It is discussed here, along with some other ideas.
https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
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-26 20:55 ` Andy Wingo
0 siblings, 2 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-20 17:03 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 16:20, Ludovic Courtès wrote:
>> In 'guile-config link', the flag '-lgc' is missing; it is needed when
>> linking smobs. The function SCM_NEWSMOB calls
>> GC_register_finalizer_no_order() in header gc.h
>
> It shouldn’t be needed when libguile is a shared library, at least not
> on ELF platforms where the shared library contains ‘NEEDED’ headers.
>
> It is needed when libguile is static, but in that case you should use
> ‘pkg-config guile-2.0 --libs --static’ (‘guile-config’ is deprecated.)
The file gc.h says that it is only for Java implementations. But as
noted above, it is called by SCM_NEWSMOB, so until it is taken away, -
lgc must be used, otherwise the linker will require it. My platform is
otherwise Mac OS X; objective code format is Mach-O.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-20 15:17 ` Ludovic Courtès
@ 2011-01-20 17:10 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-20 17:10 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 16:17, Ludovic Courtès wrote:
>> 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)
>
> This is the same problem as in your other message.
Yes, I thought it was first a printing problem, struggling with code
that mysteriously was broken, before realizing that you merely dump
the other values. It is OK with R5RS, which says that the behavior is
undefined.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-20 17:03 ` Hans Aberg
@ 2011-01-20 21:01 ` Ludovic Courtès
2011-01-20 21:13 ` Hans Aberg
2011-01-26 20:55 ` Andy Wingo
1 sibling, 1 reply; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-20 21:01 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hello,
Hans Aberg <haberg-1@telia.com> writes:
> On 20 Jan 2011, at 16:20, Ludovic Courtès wrote:
>
>>> In 'guile-config link', the flag '-lgc' is missing; it is needed when
>>> linking smobs. The function SCM_NEWSMOB calls
>>> GC_register_finalizer_no_order() in header gc.h
>>
>> It shouldn’t be needed when libguile is a shared library, at least not
>> on ELF platforms where the shared library contains ‘NEEDED’ headers.
>>
>> It is needed when libguile is static, but in that case you should use
>> ‘pkg-config guile-2.0 --libs --static’ (‘guile-config’ is deprecated.)
>
>
> The file gc.h says that it is only for Java implementations. But as
> noted above, it is called by SCM_NEWSMOB, so until it is taken away, -
> lgc must be used, otherwise the linker will require it. My platform is
> otherwise Mac OS X; objective code format is Mach-O.
Can you post the exact link command line and error message?
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-20 21:01 ` Ludovic Courtès
@ 2011-01-20 21:13 ` Hans Aberg
2011-01-21 16:02 ` Ludovic Courtès
0 siblings, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-20 21:13 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 22:01, Ludovic Courtès wrote:
> Can you post the exact link command line and error message?
$ make
gcc parser.o lexer.o driver.o guile++.o guile.o exception.o tuple.o
`guile-config link` -lstdc++ -o guile++
Undefined symbols:
"_GC_register_finalizer_no_order", referenced from:
_make_c_exception in exception.o
_make_exception in exception.o
_make_tuple in tuple.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [all] Error 1
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
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
1 sibling, 2 replies; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-20 21:18 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hi,
Hans Aberg <haberg-1@telia.com> writes:
> On 20 Jan 2011, at 16:16, Ludovic Courtès wrote:
>
>>> There seems to be a bug in GIT version when writing the 'values' data
>>> type.
>>> (list 2 (values 3 4) 5)
>>> $1 = (2 3 5)
>>
>> This behavior is correct: in Guile 1.9, multiple-value returns are
>> truncated any time the continuation expects fewer values.
>>
>> Here, the ‘values’ call returns 3 values, but the location where it’s
>> called expects only 1, hence the automatic truncation.
>
> After the post, I saw that R5RS says the behavior is undefined.
>
> However, quietly loosing values is inviting bugs.
I may seem sloppy, but I find it convenient. In the c.l.s thread you
mentioned, Joe Marshall writes:
With the current system, if you wish to add an extra return value, you
have to adjust the code at *every* return site (provided you can
enumerate all the return sites!). In Common Lisp, unexpected return
values are silently discarded, so modifying a function to return extra
information is a local change. Discarding the extra return values is
somewhat sloppy semantically, but far more convenient from a coding
standpoint.
>>> with the value 4 lost In guile-1.8.8, it would write
>>> (2 #<values 3 4> 5)
>>
>> The special “values” type in older Guile versions was an artifact of
>> Guile’s implementation of multiple value support; objects of that type
>> are normally invisible to user code, but they would show up in such
>> situations (R5RS doesn’t specify what to do in these cases, so it was
>> valid, but implementation-specific behavior.)
>
> The old style is a reification of the values, and could be turned into
> a tuples object. The latter is what I am implementing, but I can make
> my own type instead.
>
> It is discussed here, along with some other ideas.
>
> https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
Interesting thread.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
2011-01-20 21:18 ` Ludovic Courtès
@ 2011-01-20 21:55 ` Hans Aberg
2011-01-21 17:13 ` Values extension Hans Aberg
1 sibling, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-20 21:55 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 22:18, Ludovic Courtès wrote:
>>>> There seems to be a bug in GIT version when writing the 'values'
>>>> data
>>>> type.
>>>> (list 2 (values 3 4) 5)
>>>> $1 = (2 3 5)
>>>
>>> This behavior is correct: in Guile 1.9, multiple-value returns are
>>> truncated any time the continuation expects fewer values.
>>>
>>> Here, the ‘values’ call returns 3 values, but the location where
>>> it’s
>>> called expects only 1, hence the automatic truncation.
>>
>> After the post, I saw that R5RS says the behavior is undefined.
>>
>> However, quietly loosing values is inviting bugs.
>
> I may seem sloppy, but I find it convenient.
In view of that it may break code that relies on the old behavior, I
think it would be better to throw an exception in the case of multiple
values.
> In the c.l.s thread you
> mentioned, Joe Marshall writes:
>
> With the current system, if you wish to add an extra return value,
> you
> have to adjust the code at *every* return site (provided you can
> enumerate all the return sites!). In Common Lisp, unexpected return
> values are silently discarded, so modifying a function to return
> extra
> information is a local change. Discarding the extra return values is
> somewhat sloppy semantically, but far more convenient from a coding
> standpoint.
It also says:
> With this approach,
>
> > [E]very procedure takes exactly one argument and returns exactly one
> > result. The argument and the result will always be a sequence.
> [...]
> > An expression in tail-recursive position returns a one-element
> > sequence. Continuations accept sequences containing an arbitrary
> > number of elements as results.
This last correspond in infix syntax to combining objects f(x), where
(x) may be a tuple (x_1, ..., x_k). When f return multiple values, it
just returns a tuple, so if sent to another function accepting that
number f arguments, all would work out.
I am implementing this in a syntax on top of Guile, thinking of using
the old #<values ...> for my tuples.
But as it is not in R5RS, it does not matter. I'm making my own smob.
>> It is discussed here, along with some other ideas.
>>
>> https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
>
> Interesting thread.
Yes, I am hitting some of those problems rather quickly.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-20 21:13 ` Hans Aberg
@ 2011-01-21 16:02 ` Ludovic Courtès
2011-01-21 17:59 ` Hans Aberg
2011-01-29 21:47 ` Ludovic Courtès
0 siblings, 2 replies; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-21 16:02 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hi,
Hans Aberg <haberg-1@telia.com> writes:
> On 20 Jan 2011, at 22:01, Ludovic Courtès wrote:
>
>> Can you post the exact link command line and error message?
>
>
> $ make
> gcc parser.o lexer.o driver.o guile++.o guile.o exception.o tuple.o
> guile-config link` -lstdc++ -o guile++
This line was mangled by your mailer, I think (missing backquote,
newline inserted).
Furthermore, if you’re linking C++ code, then you should link with g++,
not gcc, and omit -lstdc++.
> Undefined symbols:
> "_GC_register_finalizer_no_order", referenced from:
> _make_c_exception in exception.o
> _make_exception in exception.o
> _make_tuple in tuple.o
> ld: symbol(s) not found
Oooh, I finally got your point about SCM_NEWSMOB. It introduces a
direct dependency from your app on libgc, which can require -lgc,
depending on the linker.
I’ll look into it. I think the GC_REGISTER_FINALIZER_NO_ORDER call
should be buried in a function akin to scm_i_new_smob_with_mark_proc.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Values extension
2011-01-20 21:18 ` Ludovic Courtès
2011-01-20 21:55 ` Hans Aberg
@ 2011-01-21 17:13 ` Hans Aberg
1 sibling, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-21 17:13 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 20 Jan 2011, at 22:18, Ludovic Courtès wrote:
>> It is discussed here, along with some other ideas.
>>
>> https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
>
> Interesting thread.
It is possible to extend Scheme values as to infix tuples usage:
Think of Scheme (f x_1 ... x_k) as equivalent to f(x_1 ... x_k), and
add the reduction of tuples singletons (x) = x. Then (f (values
x_1 ... x_k)) is the same as f((x_1 ... x_k)) = f(x_1 ... x_k), that
is (f x_1 ... x_k). However, if more than one of the x_i in is a non-
singleton, it is an iterated tuple which cannot be reduced on its
topmost level.
In addition, I extended so that if f = (f_1, ..., f_n), then f(x) is
defined to (f_1(x), ..., f_n(x)). For values, ((values f_1 ... f_n)
x_1 ... x_k) computes to (values (f_1 x_1 ... x_k) ... (f_n x_1 ...
x_k)). With this syntax, one can write (atan ((values sin cos) x)).
Also, functions that return no value might just as well return
(values) instead of an internal unspecified value. It will then be as
in C/C++.
This syntax is not at all complicated to use.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-21 16:02 ` Ludovic Courtès
@ 2011-01-21 17:59 ` Hans Aberg
2011-01-26 20:52 ` Andy Wingo
2011-01-29 21:47 ` Ludovic Courtès
1 sibling, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-21 17:59 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 21 Jan 2011, at 17:02, Ludovic Courtès wrote:
>>> Can you post the exact link command line and error message?
>>
>>
>> $ make
>> gcc parser.o lexer.o driver.o guile++.o guile.o exception.o tuple.o
>> guile-config link` -lstdc++ -o guile++
>
> This line was mangled by your mailer, I think (missing backquote,
> newline inserted).
By your mailer, I would think: when I send it to myself, it comes out
right.
> Furthermore, if you’re linking C++ code, then you should link with g+
> +,
> not gcc, and omit -lstdc++.
I do not think it matters: the linker typically supplied by the
platform, is a C linker on UNIX, and gcc mangles the names of C++ into
it C.
By contrast, g++ compiles also C files as C++.
>> Undefined symbols:
>> "_GC_register_finalizer_no_order", referenced from:
>> _make_c_exception in exception.o
>> _make_exception in exception.o
>> _make_tuple in tuple.o
>> ld: symbol(s) not found
>
> Oooh, I finally got your point about SCM_NEWSMOB. It introduces a
> direct dependency from your app on libgc, which can require -lgc,
> depending on the linker.
Right.
> I’ll look into it. I think the GC_REGISTER_FINALIZER_NO_ORDER call
> should be buried in a function akin to scm_i_new_smob_with_mark_proc.
If it is needed at all, by the comment in gc/gc.h something that it is
for Java code.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: segmentation fault
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
0 siblings, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-26 20:46 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
On Wed 19 Jan 2011 20:40, Hans Aberg <haberg-1@telia.com> writes:
> The code below causes Guile 1.9.14.68-a7d8a to crash (segmentation fault
> after awhile), on Mac OS X 10.5.8 PPC G4.
>
>
> (defmacro call (f g)
> `(apply ,g (,f)))
>
> (call (lambda () (values 4 5))
> (lambda (a b) b))
Good catch! It was an error in the error handling. Fixed in git. The
message is now:
<unnamed port>:2:1: In procedure apply:
<unnamed port>:2:1: Apply to non-list: 4
Cheers,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-19 14:44 ` GIT version: values Hans Åberg
@ 2011-01-26 20:51 ` Andy Wingo
2011-01-26 23:34 ` Hans Aberg
0 siblings, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-26 20:51 UTC (permalink / raw)
To: Hans Åberg; +Cc: bug-guile
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/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-21 17:59 ` Hans Aberg
@ 2011-01-26 20:52 ` Andy Wingo
2011-01-26 23:44 ` Hans Aberg
0 siblings, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-26 20:52 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile, Ludovic Courtès
On Fri 21 Jan 2011 18:59, Hans Aberg <haberg-1@telia.com> writes:
>>> $ make
>>> gcc parser.o lexer.o driver.o guile++.o guile.o exception.o tuple.o
>>> guile-config link` -lstdc++ -o guile++
>>
>> This line was mangled by your mailer, I think (missing backquote,
>> newline inserted).
>
> By your mailer, I would think: when I send it to myself, it comes out
> right.
I also see the mangled text.
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-20 17:03 ` Hans Aberg
2011-01-20 21:01 ` Ludovic Courtès
@ 2011-01-26 20:55 ` Andy Wingo
2011-01-26 23:47 ` Hans Aberg
1 sibling, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-26 20:55 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile, Ludovic Courtès
On Thu 20 Jan 2011 18:03, Hans Aberg <haberg-1@telia.com> writes:
> The file gc.h says that it is only for Java implementations.
Assuming you refer to gc_register_finalizer_no_order, that is not the
case; it implements a finalizer with semantics that were needed when
Java-style finalizers were added to libgc. It happens to apply to Guile
as well. I believe there are threads on the BDW-GC mailing list to this
effect.
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
2011-01-20 16:51 ` Hans Aberg
2011-01-20 21:18 ` Ludovic Courtès
@ 2011-01-26 20:57 ` Andy Wingo
2011-01-26 23:50 ` Hans Aberg
1 sibling, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-26 20:57 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile, Ludovic Courtès
On Thu 20 Jan 2011 17:51, Hans Aberg <haberg-1@telia.com> writes:
> However, quietly loosing values is inviting bugs.
True. Common Lisp does it though, FWIW. I find it convenient.
Regards,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-26 20:51 ` Andy Wingo
@ 2011-01-26 23:34 ` Hans Aberg
2011-01-27 9:00 ` Andy Wingo
0 siblings, 1 reply; 32+ messages in thread
From: Hans Aberg @ 2011-01-26 23:34 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile
On 26 Jan 2011, at 21:51, Andy Wingo wrote:
>> 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.
...
> There is no tuple with multiple-valued returns: they are returned on
> the
> stack.
Right. I was implementing infix notation tuples syntax f(x_1, ...,
x_k) using Bison on top of Guile, relying on the old behavior of
'values'. It is possible to extend Scheme values as to infix tuples
usage:
Think of Scheme (f x_1 ... x_k) as equivalent to f(x_1 ... x_k), and
add the reduction of tuples singletons (x) = x. Then (f (values
x_1 ... x_k)) is the same as f((x_1 ... x_k)) = f(x_1 ... x_k), that
is (f x_1 ... x_k). However, if more than one of the x_i in is a non-
singleton, it is an iterated tuple which cannot be reduced on its
topmost level.
In addition, I extended so that if f = (f_1, ..., f_n), then f(x) is
defined to (f_1(x), ..., f_n(x)). For values, ((values f_1 ... f_n)
x_1 ... x_k) computes to (values (f_1 x_1 ... x_k) ... (f_n x_1 ...
x_k)). With this syntax, one can write (atan ((values sin cos) x)).
Also, functions that return no value might just as well return
(values) instead of an internal unspecified value. They will then work
as in C/C++.
> Both of these behaviors are allowed by R5RS and R6RS.
This is correct.
> 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'.
But this is false. It prevents implementing tuples in Scheme, at least
using 'values'.
The topic is discussed here:
https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
It mentions the above:
> [E]very procedure takes exactly one argument and returns exactly one
> result. The argument and the result will always be a sequence. [...]
> An expression in tail-recursive position returns a one-element
> sequence. Continuations accept sequences containing an arbitrary
> number of elements as results.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: segmentation fault
2011-01-26 20:46 ` Andy Wingo
@ 2011-01-26 23:37 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-26 23:37 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile
On 26 Jan 2011, at 21:46, Andy Wingo wrote:
>> The code below causes Guile 1.9.14.68-a7d8a to crash (segmentation
>> fault
>> after awhile), on Mac OS X 10.5.8 PPC G4.
>>
>>
>> (defmacro call (f g)
>> `(apply ,g (,f)))
>>
>> (call (lambda () (values 4 5))
>> (lambda (a b) b))
>
> Good catch! It was an error in the error handling. Fixed in git.
> The
> message is now:
>
> <unnamed port>:2:1: In procedure apply:
> <unnamed port>:2:1: Apply to non-list: 4
Good you fixed it. I was actually trying some code from the link
mentioned before, thinking "this cannot work", and lo and behold, a
crash!
https://groups.google.com/group/comp.lang.scheme/browse_thread/thread/b72d987aa6626cd2/e2f7cfa55fb51d55?hl=en
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-26 20:52 ` Andy Wingo
@ 2011-01-26 23:44 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-26 23:44 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile, Ludovic Courtès
On 26 Jan 2011, at 21:52, Andy Wingo wrote:
>>>> $ make
>>>> gcc parser.o lexer.o driver.o guile++.o guile.o exception.o tuple.o
>>>> guile-config link` -lstdc++ -o guile++
>>>
>>> This line was mangled by your mailer, I think (missing backquote,
>>> newline inserted).
>>
>> By your mailer, I would think: when I send it to myself, it comes out
>> right.
>
> I also see the mangled text.
Perhaps you use the same crappy mail reader, because it came out in
the archive:
http://lists.gnu.org/archive/html/bug-guile/2011-01/msg00048.html
It comes out right in the copy that was send back to me from the list,
as well as the one I sent directly to myself.
Perhaps the lines must be broken due to the mail protocol; the reader
should then pick them together again.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-26 20:55 ` Andy Wingo
@ 2011-01-26 23:47 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-26 23:47 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile, Ludovic Courtès
On 26 Jan 2011, at 21:55, Andy Wingo wrote:
>> The file gc.h says that it is only for Java implementations.
>
> Assuming you refer to gc_register_finalizer_no_order, that is not the
> case; it implements a finalizer with semantics that were needed when
> Java-style finalizers were added to libgc. It happens to apply to
> Guile
> as well. I believe there are threads on the BDW-GC mailing list to
> this
> effect.
OK. So then the -lgc flag should probably be there.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values writing
2011-01-26 20:57 ` GIT version: values writing Andy Wingo
@ 2011-01-26 23:50 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-26 23:50 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile, Ludovic Courtès
On 26 Jan 2011, at 21:57, Andy Wingo wrote:
>> However, quietly loosing values is inviting bugs.
>
> True. Common Lisp does it though, FWIW. I find it convenient.
From what I can see, one can implement a very nice infix notation
syntax on top of Guile, which function calls f(x_1, ..., x_k). Then a
reification of (values x_1 ... x_k) correspond to tuples (x_1, ...,
x_k).
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-26 23:34 ` Hans Aberg
@ 2011-01-27 9:00 ` Andy Wingo
2011-01-27 13:20 ` Hans Aberg
0 siblings, 1 reply; 32+ messages in thread
From: Andy Wingo @ 2011-01-27 9:00 UTC (permalink / raw)
To: Hans Aberg; +Cc: bug-guile
Hi Hans,
On Thu 27 Jan 2011 00:34, Hans Aberg <haberg-1@telia.com> writes:
>> If you wish to preserve a potentially
>> multiply-valued return, you will need to set up a multiple-value
>> continuation, using `call-with-values'.
>
> But this is false.
According to the standard, passing an unintended number of values to a
continuation is undefined. To portably preserve a potentially
multiply-valued return, you need call-with-values.
You can still implement other paradigms on top of this. If you want to
express some semantics that is not specified in the report, write a
macro that wraps your expressions in call-with-values. This is
effectively what we will do for Lua, for example.
Regards,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: values
2011-01-27 9:00 ` Andy Wingo
@ 2011-01-27 13:20 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-27 13:20 UTC (permalink / raw)
To: Andy Wingo; +Cc: bug-guile
On 27 Jan 2011, at 10:00, Andy Wingo wrote:
>>> If you wish to preserve a potentially
>>> multiply-valued return, you will need to set up a multiple-value
>>> continuation, using `call-with-values'.
>>
>> But this is false.
>
> According to the standard, passing an unintended number of values to a
> continuation is undefined.
Right. Because of this, no extension is reliable - can be changed in
the future.
> To portably preserve a potentially
> multiply-valued return, you need call-with-values.
>
> You can still implement other paradigms on top of this. If you want
> to
> express some semantics that is not specified in the report, write a
> macro that wraps your expressions in call-with-values. This is
> effectively what we will do for Lua, for example.
Yes, this is what I do, first by a macro, and now, via a new tuple
type (right now a smob), a function call.
But tuples might be integrated into Scheme, so that the underlying
call-with-values become transparent.
For example, if (lambda x a) would have made the multiple values that
x picks up as 'values', then (lambda x x) becomes the identity. Now
this syntax is occupied, but it illustrates the idea.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-21 16:02 ` Ludovic Courtès
2011-01-21 17:59 ` Hans Aberg
@ 2011-01-29 21:47 ` Ludovic Courtès
2011-01-29 22:51 ` Hans Aberg
1 sibling, 1 reply; 32+ messages in thread
From: Ludovic Courtès @ 2011-01-29 21:47 UTC (permalink / raw)
To: bug-guile
Hi,
ludo@gnu.org (Ludovic Courtès) writes:
> Hans Aberg <haberg-1@telia.com> writes:
[...]
>> Undefined symbols:
>> "_GC_register_finalizer_no_order", referenced from:
>> _make_c_exception in exception.o
>> _make_exception in exception.o
>> _make_tuple in tuple.o
>> ld: symbol(s) not found
>
> Oooh, I finally got your point about SCM_NEWSMOB. It introduces a
> direct dependency from your app on libgc, which can require -lgc,
> depending on the linker.
Should be fixed now.
I ended up modifying guile-2.0.pc since other public macros/inlines use
libgc functions.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: GIT version: missing linking flag
2011-01-29 21:47 ` Ludovic Courtès
@ 2011-01-29 22:51 ` Hans Aberg
0 siblings, 0 replies; 32+ messages in thread
From: Hans Aberg @ 2011-01-29 22:51 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: bug-guile
On 29 Jan 2011, at 22:47, Ludovic Courtès wrote:
>>> Undefined symbols:
>>> "_GC_register_finalizer_no_order", referenced from:
>>> _make_c_exception in exception.o
>>> _make_exception in exception.o
>>> _make_tuple in tuple.o
>>> ld: symbol(s) not found
>>
>> Oooh, I finally got your point about SCM_NEWSMOB. It introduces a
>> direct dependency from your app on libgc, which can require -lgc,
>> depending on the linker.
>
> Should be fixed now.
>
> I ended up modifying guile-2.0.pc since other public macros/inlines
> use
> libgc functions.
Fine. So I might take down a new GIT.
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2011-01-29 22:51 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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
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).