[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Defining variables mid-stream in a music expression using tags.
From: |
Valentin Petzel |
Subject: |
Re: Defining variables mid-stream in a music expression using tags. |
Date: |
Wed, 17 May 2023 22:30:50 +0200 |
Also gotta say that this is most likely not a good thing to do. Changing
global scope variables like that can lead to confusing behaviour. Maybe if you
can elaborate on what you want to achieve we might find a more ideomatic way to
get there.
Am Mittwoch, 17. Mai 2023, 22:24:54 CEST schrieb Valentin Petzel:
> Hello David,
>
> there is some confusing going on here about how certain things are
> evaluated. When you do
>
> { ... something ... }
>
> this is evaluated pretty much as it is parsed, returning some music object.
> So
>
> \keepWithTag #'textI \tag #'textII { #(define l "B") }
>
> this will first evaluate the expression { #(define l "B") } which returns an
> empty music object and as side effect sets a variable, then it will call
> \tag upon that music, and then call \keepWithTag on that Music.
>
> What you intend to do is in fact not possible with \tag. What you want to do
> is to delay the evaluation until the point where you have the information
> to make this decision. This can be done using a music function:
>
> \version "2.24.1"
>
> #(define l '())
>
> musicfn =
> #(define-music-function (tag) (symbol?)
> #{
> #(if (equal? tag 'textI) (set! l "A"))
> #(if (equal? tag 'textII) (set! l "B"))
> c''1^\markup\l
> #(if (equal? tag 'textI) (set! l "C"))
> #(if (equal? tag 'textII) (set! l "D"))
> c''1^\markup\l
> #})
>
> \musicfn textI
> \musicfn textII
>
> Note that here it is necessary to first create the global binding using
> #(define ...) and then use (set! ...) to change that binding.
>
> Cheers,
> Valentin
>
> Am Mittwoch, 17. Mai 2023, 21:58:49 CEST schrieb dfro:
> > I want to define and change variables mid-stream in a music expression,
> > while also using tags. Below is an example of what I am trying; but, it
> > does not work.
> >
> >
> > \version "2.24.1"
> >
> > \keepWithTag #'textI
> > %\keepWithTag #'textII
> >
> >
> > {
> >
> > \tag #'textI { #(define l "A") }
> > \tag #'textII { #(define l "B") }
> > c''1 ^\markup \l
> > \tag #'textI { #(define l "C") }
> > \tag #'textII { #(define l "D") }
> > c''1 ^\markup \l
> >
> > }
> >
> >
> > The tags are not keeping lilypond from skipping the define's that are in
> > \tag #'textII. Is there a way to make this work?
> >
> > Is there a way to define variables using lilypond syntax inside a music
> > expression?
> >
> >
> > Peace,
> >
> > David
signature.asc
Description: This is a digitally signed message part.
- Defining variables mid-stream in a music expression using tags., dfro, 2023/05/17
- Re: Defining variables mid-stream in a music expression using tags., Valentin Petzel, 2023/05/17
- Re: Defining variables mid-stream in a music expression using tags.,
Valentin Petzel <=
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/17
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/17
- Re: Defining variables mid-stream in a music expression using tags., Valentin Petzel, 2023/05/18
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/18
- Re: Defining variables mid-stream in a music expression using tags., Valentin Petzel, 2023/05/18
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/18
- Re: Defining variables mid-stream in a music expression using tags., Valentin Petzel, 2023/05/19
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/19
- Re: Defining variables mid-stream in a music expression using tags., Valentin Petzel, 2023/05/20
- Re: Defining variables mid-stream in a music expression using tags., dfro, 2023/05/20