B.2.1 Definición de funciones de Scheme

La forma general de la definición de una función de Scheme es:

funcion =
#(define-scheme-function
     (parser location arg1 arg2 …)
     (tipo1? tipo2? …)
   cuerpo)

donde

parsertiene que ser literalmente parser para dar a los bloques de código de LilyPond (#{#}) acceso al analizador sintáctico.
locationtiene que ser literalmente location para ofrecer acceso al objeto de situación de la entrada, que se usa para ofrecer menssajes de error con nombres de archivo y números de línea.
argNn-ésimo argumento
typeN?un predicado de tipo de Scheme para el que argN debe devolver #t. También existe una forma especial (predicate? default) para especificar argumentos opcionales. Si el argumento actual no está presente cuando se ll ama a la función, el valor predeterminado se emplea en sustitución. Los valores predeterminados se evalúan en tiempo de definición (¡incluyendo los bloques de código de LilyPond!), de manera que se necesitamos un valor por omisión calculado en tiempo de ejecución, debemos escribir en su lugar un valor especial que podamos reconocer fácilmente. Si escribimos el predicado entre paréntesis pero no lo seguimos por el valor predeterminado, se usa #f como valor por omisión. Los valores por omisión no se verifican con predicate? en tiempo de definición ni en tiempo de ejecución: es nuestra responsabilidad tratar con los valores que especifiquemos. Los valores por omisión que son expresiones musicales se copian mientras se establece origin al parámetro location.
cuerpouna secuencia de formas de Scheme que se evalúan ordenadamente; la última forma de la secuencia se usa como el valor de retorno de la función de Scheme. Puede contener bloques de código de LilyPond encerrados entre llaves con almohadillas ( #{…#} ), como se describe en Bloques de código de LilyPond. Dentro de los bloques de código de LilyPond, use el símbolo # para hacer referencia a argumentos de función (p.ej. ‘#arg1’) o para iniciar una expresión en línea de Scheme que contenga argumentos de función (p.ej. ‘#(cons arg1 arg2)’). Donde las expresiones de Scheme normales que usan # no funcionan, podríamos necesitar volver a expresiones de Scheme inmediatas que usan $, como por ejemplo ‘$music’. Si nuestra función devuelve una expresión musical, recibe un valor origin útil.

La idoneidad de los argumentos para los predicados viene determinada mediante llamadas reales al predicado después de que LilyPond ya las ha convertido en una expresión de Scheme. Como consecuencia, el argumento se puede especificar en la sintaxis de Scheme si se desea (precedido de # o como resultado de haber llamado a una función de Scheme), pero LilyPond también convierte algunas construcciones de LilyPond en Scheme antes de hacer efectivamente la comprobación del predicado sobre ellas. Actualmente se encuentran entre ellas la música, los post-eventos, las cadenas simples (entrecomilladas o no), los números, los elementos de marcado y de listas de marcado, score (partitura), book (libro), bookpart (parte de libro), las definiciones de contexto y los bloques de definición de salida.

Para ciertos tipos de expresión (como la mayor parte de la música que no está encerrada entre llaves) LilyPond necesita más allá de la expresión misma para poder determinar su final. Si tal expresión se considerase un argumento opcional mediante la evaluación de su predicado, LilyPond no podría recuperarse después de decidir que la expresión no se corresponde con el parámetro. Así, ciertas formas de música necesitan ir encerradas entre llaves para poder considerarlas como aceptables bajo algunas circunstancias. LilyPond resuelve algunas otras ambigüedades mediante la comprobación con funciones de predicado: ¿es ‘-3’ un post-evento de digitación o un número negativo? ¿Es "a" 4 en el modo de letra una cadena seguida por un número, o un evento de letra con la duración 4? LilyPond prueba el predicado del argumento sobre diversas interpretaciones sucesivas hasta que lo consigue, con un orden diseñado para minimizar las interpretaciones poco consistentes y la lectura por adelantado.

Por ejemplo, un predicado que acepta tanto expresiones musicales como alturas consideraría que c'' es una altura en lugar de una expresión musical. Las duraciones o post-eventos que siguieran inmediatamente podrían no funcionar con dicha interpretación. Así pues, es mejor evitar los predicados excesivamente permisivos como scheme? cuando la aplicación requeriría tipos de argumento más específicos.

Para ver una lista de los predicados de tipo disponibles, consulte Predicados de tipo predefinidos.

Véase también

Referencia de la notación: Predicados de tipo predefinidos.

Archivos instalados: ‘lily/music-scheme.cc’, ‘scm/c++.scm’, ‘scm/lily.scm’.


Otros idiomas: English, deutsch, français.
Acerca de la selección automática del idioma.

LilyPond — Extender v2.18.2 (rama estable).