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.


LilyPond — Extender v2.23.82 (rama de desarrollo).