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
parser | tiene que ser literalmente parser para dar a los bloques de código
de LilyPond (#{ …#} ) acceso al analizador
sintáctico. |
location | tiene 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. |
argN | n-é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 . |
cuerpo | una 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.