Thanks very much Lukas-Fabian.
This fixed all for me.
But at the same time I wonder: doesn't that API change risk to break some
other code that uses the default value in the same order I used it? I
think, for example, at Harm's snippets.
Not sure if it is a realistic case, but I suggest to check it.

Best,
Paolo

On Tue, Jan 12, 2021 at 8:01 PM Lukas-Fabian Moser <l...@gmx.de> wrote:

> Hi Paolo,
>
> Am 12.01.21 um 17:01 schrieb Paolo Prete:
> > Hello,
> >
> > I just experienced (on Linux) that this compiles with <= 2.20
> >
> > --------------------------------
> >
> > foo = #(define-music-function (parser location col staff mus)((color?
> > red) string? ly:music?)
> > #{ c' d' #})
> >
> > {
> > \foo "bar" {}
> > }
> >
> > --------------------------------
> >
> > But it doesn't compile with 2.22.0
> > What's wrong?
>
> Last May, Valentin (in 1ea236291f96dbe5) added the ability to use
> CSS-style color names (and hex color codes, and four-number RGBA colors
> with alpha channel) everywhere where previously one had to use RGB-style
> colors. (I only found out about this _great_ addition by researching
> your problem, so I'm actually quite happy right now.)
>
> For this, the color? predicate had to be weakened in order to cover more
> possible data types: Where previously, we had
>
>   (define-public (color? x)
>    (and (list? x)
>         (= 3 (length x))
>         (every number? x)
>         (every (lambda (y) (<= 0 y 1)) x)))
>
> in scm/output-lib.scm, it now reads
>
>   (define-public (color? x)
>    (or
>     (string? x)
>     (and (list? x)
>          (let ((l (length x)))
>           (or (= 3 l)
>                (= 4 l)))
>          (every number? x)
>          (every (lambda (y) (<= 0 y 1)) x))))
>
> To wit, while a color? used to be a list of exactly three numbers in
> [0,1], now it is _either_ a string _or_ a list of three or four numbers
> in the same interval.
>
> So, in your function definition, "bar" is now a valid color?, hence is
> taken as "col", and consequently LilyPond tries to read {} as a string?.
> I see two solutions for your problem:
>
> a) If you only ever need rgb colors, you could define and old-style
> color? predicate and use this in your function definition.
> b) You could re-order the parameters to your function in such a way that
> the next predicate after the optional color? is not a sub-predicate of
> color?. One example would be ly:music?, so the following works (I omit
> "parser"/"location"):
>
> \version "2.22"
>
> foo = #(define-music-function (col mus staff) ((color? red) ly:music?
> string?)
> #{ c' d' #})
>
> {
> \foo {} "bar"
> }
>
> Best
> Lukas
>
>

Reply via email to