lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Changed behaviour of 'split-at' with guilev2


From: Thomas Morley
Subject: Re: Changed behaviour of 'split-at' with guilev2
Date: Sun, 14 Oct 2018 14:43:34 +0200

Am So., 14. Okt. 2018 um 12:31 Uhr schrieb David Kastrup <address@hidden>:
>
> Thomas Morley <address@hidden> writes:
>
> > Am So., 14. Okt. 2018 um 11:56 Uhr schrieb David Kastrup <address@hidden>:
> >>
> >> Thomas Morley <address@hidden> writes:
> >>
> >> > Hi,
> >> >
> >> > I stumbled across different behaviour of 'split-at' in guilev1/2. Doing
> >> > (define (foo) (write (split-at '(1 2 3) 1)))
> >> > (foo)
> >> > returns
> >> > in guilev1
> >> > #<values ((1) (2 3))>
> >> > in guilev2 only
> >> > (1)
> >>
> >> I rather think that Guilev2 just deals a bit differently with multiple
> >> values, dropping additional values in scheme-only contexts with
> >> single-value takers like `write'.
> >
> > It bombed out one of my codings, before I found the culprit.
>
> You cannot generally _store_ multiple-value objects in Guilev2 (or
> actually Scheme proper) since they are not conceptually proper objects
> (C++ programmers will be reminded of references as opposed to pointers).
> Basically you can only return them, and functions calling a
> multiple-value returning function as the last thing they do will return
> the same multiple values.
>
> The only thing guaranteed to do anything with multiple values is
> call-with-values and stuff derived from it.
>
> The documentation states:
>
>  -- Scheme Procedure: values arg ...
>  -- C Function: scm_values (args)
>      Delivers all of its arguments to its continuation.  Except for
>      continuations created by the ‘call-with-values’ procedure, all
>      continuations take exactly one value.  The effect of passing no
>      value or more than one value to continuations that were not created
>      by ‘call-with-values’ is unspecified.
>
>      For ‘scm_values’, ARGS is a list of arguments and the return is a
>      multiple-values object which the caller can return.  In the current
>      implementation that object shares structure with ARGS, so ARGS
>      should not be modified subsequently.
>
> and indeed R5RS states the possible implementation of values as
>
> (define (values . things)
>   (call-with-current-continuation
>     (lambda (cont) (apply cont things))))
>
> Of course, this still requires call-with-values itself for creating a
> continuation taking multiple values.  Note that the standard as well as
> Guile's documentation itself states
>
>      The effect of passing no value or more than one value to
>      continuations that were not created by ‘call-with-values’ is
>      unspecified.
>
> and the Guilev1 behavior was to create a multiple-values object while
> the Guilev2 behavior is to drop extra values unless the continuation is
> a C API call, in which a multiple-values object does get passed.
>
> If this is giving you a headache, rest assured that it is giving
> _everyone_ a headache.
>
> --
> David Kastrup

Indeed, if I wouldn't have a headache already ...

Nevertheless, good to know that using ‘call-with-values’ will work for
guilev1 and guilev2

Thanks,
  Harm



reply via email to

[Prev in Thread] Current Thread [Next in Thread]