Referencia de la notación de GNU LilyPond: 6.2.1 Input variables and Scheme

### 6.2.1 Input variables and 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 }

    %% 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 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 Void functions, 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`.

Other languages: English.

#### Manual de referencia de la notación