lilypond-devel
[Top][All Lists]
Advanced

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

Re: Optional arguments of a music-function?


From: David Kastrup
Subject: Re: Optional arguments of a music-function?
Date: Tue, 17 Jul 2012 15:45:37 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (gnu/linux)

Thomas Morley <address@hidden> writes:

> Hi,
>
> I tried to adapt the syntax-trickery David showed with the new
> \tweak-definition to an own function.
>
> Trying a code like the tiny example below fails.
>
> proc =
> #(define-music-function (parser location name arg)((string?) ly:music?)
>   (if name
>   #{ \once \override $name #'color = #red  $arg #}
>   #{ \parenthesize $arg #}))
>
> \relative c' {
>         c1
>         \proc "NoteHead" c
>         \proc c
> }
>
> Obviously I did sth wrong.

Not obviously.  Unobviously, however, we have the situation that
optional arguments can only be properly checked by the parser when they
can be parsed without lookahead, namely are a "closed" expression, since
only then the parser can push the value back onto its token stack: if it
has already looked at a lookahead token, it does not have this option
since the parser state already depends on the value of the lookahead
token.

A pitch can't be parsed without lookahead since it may be followed by
''' and/or ,,, and so lookahead is needed to make the decision.  On the
other hand, we have other situations where the user is not supposed to
change the meaning of a predicate when its _value_ rather than its type
changes, so a predicate that fails or succeeds depending on the _octave_
of a pitch, or on the presence of a postevent or similar, is not kosher
anyway.

> Well, I could do:
>
> #(define-public (string-or-music? x)
>   (or (string? x) (ly:music? x)))
>
> procII =
> #(define-music-function (parser location arg)(string-or-music?)
>   (if (string? arg)
>   #{ \once \override $arg #'color = #red  #}
>   #{ \parenthesize $arg #}))
>
> \relative c' {
>         c1
>         \procII "NoteHead" c
>         \procII c
> }
>
> But I'd prefer the first version.
> How  to do?

Wait a few days.

It's the same problem as with
<URL:http://code.google.com/p/lilypond/issues/detail?id=2067#c19>, and
the idea to look at the pitch identifier only at first (rather than the
whole pitch) did occur to me only now.  It is conceivable that I can
rein this in.

Until I do, the syntactical possibilities for a music argument following
an optional argument are restricted.  You can always remove the
restriction by explicitly turning this into one lookahead-free token,
say with

\procII ##{ c4 #}

but this is not really pretty.

-- 
David Kastrup




reply via email to

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