B.2.3 Funciones de Scheme vacías (Extender LilyPond)

#### B.2.3 Funciones de Scheme vacías

En ocasiones, un procedimiento se ejecuta con el objeto de llevar a cabo alguna acción más que para devolver un valor. Algunos lenguajes de programación (como C y Scheme) usan las funciones para los dos conceptos y se limitan a descartar el valor devuelto (usualmente haciendo que cualquier expresión pueda actuar como instrucción, ignorando el resultado devuelto). Esto puede parecer inteligente pero es propenso a errores: casi todos los compiladores de C de hoy en día emiten advertencias cuando se descarta una expresión no vacía. Para muchas funciones que ejecutan una acción, los estándares de Scheme declaran que el valor de retorno sea no especificado. Guile, el intérprete de Scheme de LilyPond, tiene un valor único `*unspecified*` que en tales casos devuelve de forma usual (como cuando se usa directamente `set!` sobre una variable), pero desgraciadamente no de forma consistente.

Definir una función de LilyPond con `define-void-function` asegura que se devuelve este valor especial, el único valor que satisface el predicado `void?`.

    noApuntarYPulsar =
    #(define-void-function
         ()
         ()
       (ly:set-option 'point-and-click #f))
    …
    \noApuntarYPulsar   % desactivar la función de apuntar y pulsar

Si queremos evaluar una expresión sólo por su efecto colateral y no queremos que se interprete ningún valor que pueda devolver, podemos hacerlo anteponiendo el prefijo `\void`:

    \void #(hashq-set! some-table some-key some-value)

De esta forma podemos asegurar que LilyPond no asignará ningún significado al valor devuelto, independientemente de dónde lo encuentre. También funciona para funciones musicales como `\displayMusic`.

#### 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