B.2.2 Uso de las funciones de Scheme (Extender LilyPond)

#### B.2.2 Uso de las funciones de Scheme

Las funciones de Scheme se pueden llamar casi desde cualquier lugar en que puede escribirse una expresión de Scheme que comience con la almohadilla ‘`#`’. Llamamos a una función de Scheme escribiendo su nombre precedido de la barra invertida `\`, y seguido por sus argumentos. Una vez que un argumento opcional no corresponde a ningún argumento, LilyPond se salta este argumento y todos los que le siguen, sustituyéndolos por su valor por omisión especificado, y ‘recupera’ el argumento que no correspondía al lugar del siguiente argumento obligatorio. Dado que el argumento recuperado necesita ir a algún lugar, los argumentos opcionales no se consideran realmente opcionales a no ser que vayan seguidos de un argumento obligatorio.

Existe una excepción: si escribimos `\default` en el lugar de un argumento opcional, este argumento y todos los argumentos opcionales que le siguen se saltan y se sustituyen por sus valores predeterminados. Esto funciona incluso si no sigue ningún argumento obligatorio porque `\default` no necesita recuperarse. Las instrucciones `mark` y `key` hacen uso de este truco para ofrecer su comportamiento predeterminado cuando van seguidas solamente por `\default`.

Aparte de los lugares en que se requiere un valor de Scheme hay ciertos sitios en que se aceptan expresiones de almohadilla ‘`#`’ y se evalúan por sus efectos secundarios, pero por lo demás se ignoran. Son, mayormente, los lugares en que también sería aceptable colocar una asignación.

Dado que no es buena idea devolver valores que puedan malinterpretarse en algún contexto, debería usar funciones de Scheme normales solo para los casos en que siempre se devuelve un valor útil, y usar funciones de Scheme vacías (see Funciones de Scheme vacías) en caso contrario.

Por conveniencia, las funciones de Scheme también se pueden llamar directamente desde Scheme, puenteando al analizador sintáctico de LilyPond. Su nombre puede utilizarse como el nombre de una función corriente. La comprobación de tipo de los argumentos y el salto de los argumentos opcionales tiene lugar de la misma forma que cuando se llama desde dentro de LilyPond, tomando el valor de Scheme `*unspecified*` el papel de la palabra reservada `\default` para saltar explícitamente argumentos opcionales. Los argumentos opcionales al final de una lista de argumentos se pueden simplemente omitir sin más indicación cuando se llaman a través de Scheme.

#### Extender LilyPond v2.26.0 (stable-branch).

- Appendix A Tutorial de Scheme
  - A.1 Introducción a Scheme
    - A.1.1 Cajón de arena de Scheme
    - A.1.2 Variables de Scheme
    - A.1.3 Tipos de datos simples de Scheme
    - A.1.4 Tipos de datos compuestos de Scheme
      - Parejas
      - Listas
      - Listas asociativas (listas-A)
      - Tablas de hash
    - A.1.5 Cálculos en Scheme
    - A.1.6 Procedimientos de Scheme
      - Definir procedimientos
      - Predicados
      - Valores de retorno
    - A.1.7 Condicionales de Scheme
      - if
      - cond
  - A.2 Scheme dentro de LilyPond
    - A.2.1 Sintaxis del Scheme de LilyPond
    - A.2.2 Variables de LilyPond
    - A.2.3 Depuración del código de Scheme
    - A.2.4 Variables de entrada y Scheme
    - A.2.5 Importación de Scheme dentro de LilyPond
    - A.2.6 Propiedades de los objetos
    - A.2.7 Variables de LilyPond compuestas
      - Desplazamientos
      - Fracciones
      - Dimensiones
      - Listas-A de propiedades
      - Cadenas de listas-A
    - A.2.8 El modelo de caja de LilyPond
    - A.2.9 Representación interna de la música
  - A.3 Construir funciones complicadas
    - A.3.1 Una primera aproximación (ejemplo)
    - A.3.2 Presentación de las expresiones musicales
    - A.3.3 Propiedades musicales
    - A.3.4 Duplicar una nota con ligaduras (ejemplo)
    - A.3.5 Añadir articulaciones a las notas (ejemplo)
- B Interfaces para programadores
  - B.1 Bloques de código de LilyPond
  - B.2 Funciones de Scheme
    - B.2.1 Definición de funciones de Scheme
    - B.2.2 Uso de las funciones de Scheme
    - B.2.3 Funciones de Scheme vacías
  - B.3 Funciones musicales
    - B.3.1 Definiciones de funciones musicales
    - B.3.2 Uso de las funciones musicales
    - B.3.3 Funciones de sustitución sencillas
    - B.3.4 Funciones de sustitución intermedias
    - B.3.5 Matemáticas dentro de las funciones
    - B.3.6 Funciones sin argumentos
    - B.3.7 Funciones musicales vacías
  - B.4 Funciones de eventos
  - B.5 Funciones de marcado
    - B.5.1 Construcción de elementos de marcado en Scheme
    - B.5.2 Cómo funcionan internamente los elementos de marcado
    - B.5.3 Definición de una instrucción de marcado nueva
      - Sintaxis de la definición de instrucciones de marcado
      - Acerca de las propiedades
      - Un ejemplo completo
      - Adaptación de instrucciones incorporadas
      - Convertir elementos de marcado en cadenas
    - B.5.4 Definición de nuevas instrucciones de lista de marcado
  - B.6 Contextos para programadores
    - B.6.1 Evaluación de contextos
    - B.6.2 Ejecutar una función sobre todos los objetos de la presentación
  - B.7 Funciones de callback
  - B.8 Contenedores Unpure-pure
  - B.9 Trucos difíciles
- C Interfaces de Scheme de LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índice