A.2.3 Variables de entrada y Scheme
El formato de entrada contempla la noción de variables: en el
siguiente ejemplo, se asigna una expresión musical a una variable
con el nombre traLaLa
.
traLaLa = { c'4 d'4 }
También hay una forma de ámbito: en el ejemplo siguiente, el
bloque \layout
también contiene una variable
traLaLa
, que es independiente de la \traLaLa
externa.
traLaLa = { c'4 d'4 } \layout { traLaLa = 1.0 }
En efecto, cada archivo de entrada constituye un ámbito, y cada
bloque \header
, \midi
y \layout
son ámbitos
anidados dentro del ámbito de nivel superior.
Tanto las variables como los ámbitos están implementados en el sistema de módulos de GUILE. A cada ámbito se adjunta un módulo anónimo de Scheme. Una asignación de la forma:
traLaLa = { c'4 d'4 }
se convierte internamente en una definición de Scheme:
(define traLaLa Valor Scheme de `…
')
Esto significa que las variables de LilyPond y las variables de
Scheme se pueden mezclar con libertad. En el ejemplo siguiente,
se almacena un fragmento de música en la variable traLaLa
,
y se duplica usando Scheme. El resultado se importa dentro de un
bloque \score
por medio de una segunda variable
twice
:
traLaLa = { c'4 d'4 } #(define newLa (map ly:music-deep-copy (list traLaLa traLaLa))) #(define twice (make-sequential-music newLa)) \twice
En realidad, éste es un ejemplo bastante interesante. La
asignación solo tiene lugar después de que el analizador
sintáctico se ha asegurado de que no sigue nada parecido a
\addlyrics
, de manera que necesita comprobar lo que viene a
continuación. Lee el símbolo #
y la expresión de Scheme
siguiente sin evaluarla, de forma que puede proceder a la
asignación, y posteriormente ejecutar el código de Scheme
sin problema.