Thomas Morley <thomasmorle...@googlemail.com> writes:

> Hi,
>
> I tried to create a function which should accept a pitch _or_ music.
> So I defined a pitch-or-music? predicate:
>
> #(define (pitch-or-music? x)
>   (or (ly:pitch? x) (ly:music? x)))
>
> Calling the function, I have to use ##{ ... #} for music _and_ for a
> single pitch.
For music it should work anyhow.  The problem with pitch is that at the
current point of time, ly:pitch? and ly:duration? are specially detected
and specially treated, so even if you do

#(define (mypitch? x) (ly:pitch? x))

it will not work.  However, the predicate does not make all that much
sense since every pitch is also valid music.  If we fastforward a few
months until pitch? is no longer special-cased, the parser will see the
pitch, try passing it as a pitch to the predicate and, since the
predicate accepts, will _stick_ with this choice.  You could pass music
by starting with { or so.

> Calling the function for a single pitch doesn't work, if ##{ #} are
> omitted, but it'll work if the predicate would be ly:pitch?
> I don't understand this behaviour.

Welcome to the club.  In 2.14, _all_ predicates were special-cased, and
people did not understand it.  Pitches and durations are hardest to
normalize.  I am on it, but then frequent other projects got in between.

> Is there any possibility to get rid of ##{ #}, when calling the
> function with a single pitch, but to keep the possibility to call it
> with some music?

Well, I have the xxx.xxx.xxx project pending (and it will be quite a bit
of work to document as well), waiting for the 2.16.1 release (also my
responsibility) in order to get the translation branches switched over
from 2.16 to 2.17.  Then I can get back to the pitch and duration
problem.  Several weeks.

-- 
David Kastrup


_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to