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 (arg1 arg2 …) (tipo1? tipo2? …) cuerpo)
donde
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 a la ubicación actual del
cursor de entrada. |
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.
LilyPond resuelve algunas 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
siguen inmediatamente, cambian dicha interpretación. 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’.