Extender LilyPond: B.6.1 Evaluación de contextos

### B.6.1 Evaluación de contextos

Se pueden modificar los contextos durante la interpretación con código de Scheme. Dentro de un bloque de código de LilyPond, la sintaxis para esto es:

>     \applyContext función

En código de Scheme, la sintaxis es:

>     (make-apply-context function)

`función` debe ser una función de Scheme que toma un único argumento, que es el contexto al que aplicarla. La función puede acceder a, así como sobreescribir u establecer propiedades de grobs s y propiedades de contextos. Cualquier acción tomada por la función que dependa del estado del contexto, está limitada al estado del contexto en el momento de llamar a la función. Asimismo, los cambios efectuados por una llamada a `\applyContext` permanecen en efecto hasta que se modifican de nuevo directamente, o se revierten, incluso si han cambiado las condiciones iniciales sobre las que dependen.

Las siguientes funciones de Scheme son útiles cuando se utiliza `\applyContext`:

`ly:context-property`

  recuperar el valor de una propiedad de contexto

`ly:context-set-property!`

  establecer el valor de una propiedad de contexto

`ly:context-grob-definition`
`ly:assoc-get`

  recuperar el valor de una propiedad de un grob

`ly:context-pushpop-property`

  hacer una sobreescritura temporal (`\temporary \override`) o una reversión (`\revert`) sobre una propiedad de un grob

El ejemplo siguiente recupera el valor actual de `fontSize`, y a continuación lo dobla:

>     doubleFontSize =
>     \applyContext
>       #(lambda (context)
>          (let ((fontSize (ly:context-property context 'fontSize)))
>            (ly:context-set-property! context 'fontSize (+ fontSize 6))))

>     {
>       \set fontSize = -3
>       b'4
>       \doubleFontSize
>       b'
>     }

El ejemplo siguiente recupera los colores actuales de los grobs `NoteHead`, `Stem` y `Beam`, y a continuación los modifica para que tengan un matiz menos saturado.

>     desaturate =
>     \applyContext
>       #(lambda (context)
>          (define (desaturate-grob grob)
>            (let* ((grob-def (ly:context-grob-definition context grob))
>                   (color (ly:assoc-get 'color grob-def black))
>                   (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color)))
>              (ly:context-pushpop-property context grob 'color new-color)))
>          (for-each desaturate-grob '(NoteHead Stem Beam)))

>     \relative {
>       \time 3/4
>       g'8[ g] \desaturate g[ g] \desaturate g[ g]
>       \override NoteHead.color = #darkred
>       \override Stem.color = #darkred
>       \override Beam.color = #darkred
>       g[ g] \desaturate g[ g] \desaturate g[ g]
>     }

Esto puede implementarse también como una función musical, con el objeto de restringir las modificaciones a un único bloque de música. Observe cómo se usa `ly:context-pushpop-property` tanto como una sobreescritura temporal (`\temporary \override`) como una reversión (`\revert`):

>     desaturate =
>     #(define-music-function
>        (music) (ly:music?)
>        #{
>          \applyContext
>          #(lambda (context)
>             (define (desaturate-grob grob)
>               (let* ((grob-def (ly:context-grob-definition context grob))
>                      (color (ly:assoc-get 'color grob-def black))
>                      (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color)))
>                 (ly:context-pushpop-property context grob 'color new-color)))
>             (for-each desaturate-grob '(NoteHead Stem Beam)))
>          #music
>          \applyContext
>          #(lambda (context)
>             (define (revert-color grob)
>               (ly:context-pushpop-property context grob 'color))
>             (for-each revert-color '(NoteHead Stem Beam)))
>        #})

>     \relative {
>       \override NoteHead.color = #darkblue
>       \override Stem.color = #darkblue
>       \override Beam.color = #darkblue
>       g'8 a b c
>       \desaturate { d c b a }
>       g b d b g2
>     }

#### LilyPond — Extender v2.22.2 (rama estable).