[ << Tutorial de Scheme ] | [Arriba][Índice general][Índice][ ? ] | [ Interfaces para programadores >> ] | ||
[ < Variables de LilyPond ] | [ Subir : Scheme dentro de LilyPond ] | [ Propiedades de los objetos > ] |
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 } %% dummy action to deal with parser lookahead #(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 la sentencia muda del ejemplo
anterior, la definición de newLa
se ejecuta antes de que se
defina traLaLa
, produciendo un error de sintaxis.
El ejemplo anterior muestra cómo ‘exportar’ expresiones musicales
desde la entrada al intérprete de Scheme. Lo contrario también es
posible. Envolviendo un valor de Scheme en la función
ly:export
, se interpreta un valor de Scheme 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
... { #(ly:export (make-sequential-music (list newLa))) }
El código de Scheme se evalúa tan pronto como el analizador sintáctico lo encuentra. Para definir código de Scheme dentro de un macro (para llamarse más tarde), utilice 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
.
[ << Tutorial de Scheme ] | [Arriba][Índice general][Índice][ ? ] | [ Interfaces para programadores >> ] | ||
[ < Variables de LilyPond ] | [ Subir : Scheme dentro de LilyPond ] | [ Propiedades de los objetos > ] |