A.2.4 Importación de Scheme dentro de LilyPond

El ejemplo anterior muestra cómo ‘exportar’ expresiones musicales desde la entrada al intérprete de Scheme. Lo contrario también es posible. Colocándolo después de $, un valor de Scheme se interpreta como si hubiera sido introducido en la sintaxis de LilyPond. En lugar de definir \twice, el ejemplo anterior podría también haberse escrito como

…
$(make-sequential-music newLa)

Podemos utilizar $ con una expresión de Scheme en cualquier lugar en el que usaríamos \nombre después de haber asignado la expresión de Scheme a una variable nombre. Esta sustitución se produce dentro del ‘analizador léxico’, de manera que LilyPond no llega a darse cuenta de la diferencia.

Sin embargo, existe un inconveniente, el de la medida del tiempo. Si hubiésemos estado usando $ en vez de # para definir newLa en el ejemplo anterior, la siguiente definición de Scheme habría fracasado porque traLaLa no habría sido definida aún. Para ver una explicación de este problema de momento temporal, véase Sintaxis del Scheme de LilyPond.

Un conveniente aspecto posterior pueden ser los operadores de ‘división de listas’ $@ y #@ para la inserción de los elementos de una lista dentro del contexto circundante. Utilizándolos, la última parte del ejemplo se podría haber escrito como

…
{ #@newLa }

Aquí, cada elemento de la lista que está almacenado en newLa se toma en secuencia y se inserta en la lista, como si hubiésemos escrito

{ #(first newLa) #(second newLa) }

Ahora bien, en todas esas formas, el código de Scheme se evalúa en el momento en que el código de entrada aún se está procesando, ya sea en el analizador léxico o en el analizador sintáctico. Si necesitamos que se ejecute en un momento posterior, debemos consultar Funciones de Scheme vacías, o almacenarlo dentro de un procedimiento:

#(define (nopc)
  (ly:set-option 'point-and-click #f))

…
#(nopc)
{ c'4 }

Advertencias y problemas conocidos

No es posible mezclar variables de Scheme y de LilyPond con la opción ‘--safe’.


LilyPond — Extender v2.23.82 (rama de desarrollo).