B.1 Bloques de código de LilyPond
La creación de expresiones musicales en Scheme puede ser una tarea tediosa porque a veces presentan muchos niveles de profundidad de anidamiento y el código resultante es grande. Para algunas tareas sencillas, esto puede evitarse utilizando bloques de código de LilyPond, que permiten usar la sintaxis ordinaria de LilyPond dentro de Scheme.
Los bloques de código de LilyPond tienen el siguiente aspecto:
#{ código de LilyPond #}
He aquí un ejemplo trivial:
ritpp = #(define-event-function () () #{ ^"rit." \pp #} ) { c'4 e'4\ritpp g'2 }
Los bloques de código de LilyPond se pueden usar en cualquier
lugar en el que se pueda escribir código de Scheme. El lector de
Scheme en efecto se modifica para que pueda incorporar bloques de
código de LilyPond y pueda ocuparse de las expresiones de Scheme
incrustadas que comienzan por $
y #
.
El lector extrae el bloque de código de LilyPond y genera una
llamada en tiempo de ejecución al analizador sintáctico para que
interprete el código de LilyPond. Las expresiones de Scheme
incrustadas en el código de LilyPond se evalúan dentro del
entorno léxico del bloque de código de LilyPond, de manera que
puede accederse a todas las variables locales y los parámetros de
función que están disponibles en el punto en que se escribe el
bloque de código de LilyPond. Las variables definidas en otros
módulos de Scheme, como los módulos que contienen bloques
\header
y \layout
, no están accesibles como
variables de Scheme, es decir, precedidas de #
, pero
se puede acceder a ellas como variables de LilyPond, es decir,
precedidas de \
.
Toda la música generada dentro del bloque de código tiene su ‘origin’ establecido a la localización actual del puntero de entrada.
Un bloque de código de LilyPond puede contener cualquier cosa que podríamos utilizar en la parte derecha de una asignación. Además, un bloque de LilyPond vacío corresponde a una expresión musical vacía, y un bloque de LilyPond que contiene varios eventos musicales se convierte en una expresión de música secuencial.