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. |
argN | n-ésimo argumento |
typeN? | un predicado de tipo de Scheme para el que argN
debe devolver #t . Algunos de estos predicados se reconocen de
forma especial por parte del analizador, véase más abajo. 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. |
Ciertos predicados de tipo se manejan de forma especial por parte del
analizador sintáctico ya que de otro modo éste no es capaz de
reconocer los argumentos eficientemente. Actualmente son
ly:pitch?
y ly:duration?
.
La idoneidad de lpos argumentos para el resto de 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 que LilyPond pueda
aceptarlas. Existen también otras ambigüedades que LilyPond resuelve
mediante la comprobación con funciones de predicado: ¿es ‘-3’ un
post-evento de digitación o un nnú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 lo decide preguntándole a
los predicados. Ello significa que un debemos evitar los
predicados permisivos como scheme?
si tenemos en mente
un uso particular en vez de una función de uso general.
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.