B.2.3 Funcions de l’Scheme buides

En ocasions, un procediment s’executa amb l’objectiu de fer alguna acció més per retornar un valor. Alguns llenguatges de programació (com a C i l’Scheme) usen les funcions per als dos conceptes i es limiten a descartar el valor retornat (usualment fent que qualsevol expressió pugui actuar com a instrucció, ignorant el resultat retornat). Això pot semblar intel·ligent però és propens a errors: gairebé tots els compiladors de C d’avui en dia emeten advertiments quan es descarta una expressió no buida. Per a moltes funcions que executen una acció, els estàndards de l’Scheme declaren que el valor de retorn sigui no especificat. Guile, l’intèrpret de l’Scheme al LilyPond, té un valor únic *unspecified* que en tals casos retorna de forma usual (com quan es fa servir directament set! sobre una variable), però desgraciadament no de forma consistent.

Definir una funció del LilyPond amb define-void-function assegura que es retorna aquest valor especial, l’únic valor que satisfà el predicat void?.

noApuntarYPulsar =
#(define-void-function
     ()
     ()
   (ly:set-option 'point-and-click #f))
…
\noApuntarYPulsar   % desactivar la funció d'apuntar i clicar

Si volem avaluar una expressió sols pel seu efecte col·lateral i no volem que s’interpreti cap valor que pugui retornar, podem fer-lo anteposant el prefix \void:

\void #(hashq-set! alguna-taula alguna-clau algun-valor)

D’aquesta forma podem assegurar que el LilyPond no assignarà cap significat al valor retornat, independentment d’on el trobi. També funciona per a funcions musicals com \displayMusic.


Extender LilyPond v2.25.27 (development-branch).