6.2.1 Variables de entrada y Scheme
El formato de entrada contempla la noción de variables: en el ejemplo
siguiente, se asigna una expresión musical a una variable con el
nombre traLaLa
.
traLaLa = { c'4 d'4 }
También existe una forma de ámbito léxico: en el ejemplo siguiente, el
bloque \layout
también contiene una variable traLaLa
,
que es independiente de la \traLaLa
exterior.
traLaLa = { c'4 d'4 } \layout { traLaLa = 1.0 }
De hecho, cada archivo de entrada es un ámbito léxico, y todos los
bloques \header
, \midi
y \layout
son ámbitos
anidados dentro de dicho ámbito de nivel superior.
Tanto el ámbito léxico como las variables están implementados en el sistema de módulos GUILE. Se adjunta un módulo anónimo de Scheme a cada ámbito. Una asignación de la forma
traLaLa = { c'4 d'4 }
se convierte internamente a una definición de Scheme
(define traLaLa Scheme value of `...
')
Esto supone que las variables de entrada y las variables de Scheme se
pueden intermezclar con libertad. En el ejemplo siguiente, se
almacena un fragmento musical en la variable traLaLa
, y se
dupplica utilizando Scheme. El resultado se importa en un bloque
\score
por medio de una segunda variable twice
:
traLaLa = { c'4 d'4 } %% acción vacía para la predicción del analizador sintáctico #(display "this needs to be here, sorry!") #(define newLa (map ly:music-deep-copy (list traLaLa traLaLa))) #(define twice (make-sequential-music newLa)) { \twice }
En este ejemplo, la asignación se produce después de que el analizador
sintáctico ha verificado que no ocurre nada interesante después de
traLaLa = { ... }
. Sin el argumento mudo del ejemplo, la
definición newLa
se ejecuta antes de que se defina
traLaLa
, conduciendo a un error de sintaxis.
El ejemplo anterior muestra cómo ‘exportar’ expresiones musicales
desde la entrada hasta el intérprete de Scheme. También es posible lo
contrario. Envolviendo un valor de Scheme en la función
ly:export
, un valor de Scheme se interpreta como si hubiera
sido introducido en sintaxis de LilyPond. En vez de definir
\twice
, el ejemplo anterior podría también haberse escrito como
... { #(ly:export (make-sequential-music (list newLa))) }
El sódigo de Scheme se evalúa tan pronto como el analizador sintáctico lo encuentra. Para definir código de Scheme en un macro (para llamarlo con posterioridad), use Funciones vacías, o bien
#(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
.
Otros idiomas: English.