[ << Interfícies per a programadors ] | [Top][Contents][Index] | [ Interfícies de l’Scheme del LilyPond >> ] |
[ < Funcions de l’Scheme ] | [ Up: Funcions de l’Scheme ] | [ Ús de les funcions de l’Scheme > ] |
B.2.1 Definició de funcions de l’Scheme
La forma general de la definició d’una funció de l’Scheme és:
funcion = #(define-scheme-function (arg1 arg2 …) (tipus1? tipus2? …) cuerpo)
donde
argN | n-èssim argument. |
tipusN? | Un predicat de tipus de l’Scheme per al qual
argN ha de retornar #t . També
existeix una forma especial (predicate?
default) per especificar arguments opcionals. Si
l’argument actual no està present quan es crida a la funció, s’usa
el valor predeterminat en substitució. Els valors predeterminats
s’avaluen en temps de definició (incloent-hi els blocs de codi del
LilyPond!), de manera que si ens cal un valor per omissió calculat
en temps d’execució, hem d’escriure en el seu lloc un valor
especial que puguem reconèixer fàcilment. Si escrivim el
predicat entre parèntesis, però no seguim pel valor predeterminat,
s’usa #f como a valor per omissió. Els valors per omissió
no es verifiquen amb predicate? en temps de definició ni en
temps d’execució: és la nostra responsabilitat tractar amb els
valors que especifiquem. Els valors per omissió que són
expressions musicals es copien mentre s’estableix origin a
la ubicació actual del cursor d’entrada. |
cos | una seqüència de formes de l’Scheme que s’avaluen
ordenadament; l’última forma de la seqüència s’usa com el valor de
retorn de la funció de l’Scheme. Pot contenir blocs de codi del
LilyPond tancat entre claus amb coixinets
( #{…#} ), tal com es descriu a
Blocs de codi del LilyPond. Dins dels blocs de codi del LilyPond
useu el símbol # per fer referència a arguments de funció
(per exemple ‘#arg1’) o per iniciar una expressió en línia de
l’Scheme que contingui arguments de funció (per exemple
‘#(cons arg1 arg2)’). On les expressions normals de
l’Scheme que usen # no funcionen, ens podria caldre tornar
a expressions de l’Scheme immediates que usen $ , com per
exemple ‘$music’.
Si la nostra funció torna una expressió musical, rep un valor de
|
La idoneïtat dels arguments per als predicats es determina
mitjançant crides reals al predicat després que el LilyPond ja las
hagi convertit en una expressió de l’Scheme. Com a conseqüència,
l’argument es pot especificar en la sintaxi de l’Scheme si es
desitja (precedit de #
o com a resultat d’haver cridat una
funció de l’Scheme), però el LilyPond també converteix algunes
construccions del LilyPond a Scheme abans de fer efectivament la
comprovació del predicat sobre elles. Actualment es troben entre
elles la música, els post-esdeveniments, les cadenes simples
(entre cometes o no), els nombres, els elements de marcatge i de
llistes de marcatge, score (partitura), book (llibre), bookpart
(part de llibre), les definicions de context i els blocs de
definició de sortida.
El LilyPond resol algunes ambigüitats mitjançant la comprovació
amb funcions de predicat: és ‘-3’ un post-esdeveniment de
digitació o un nombre negatiu? És "a" 4
en el mode de
lletra una cadena seguida per un nombre, o un esdeveniment de
lletra amb la duració 4
? El LilyPond prova el predicat de
l’argument sobre diverses interpretacions successives fins que ho
aconsegueix, amb un ordre dissenyat per minimitzar les
interpretacions poc consistents i la lectura per avançat.
Per exemple, un predicat que accepta tant expressions musicals com
altures consideraria que c''
és una altura en lloc d’una
expressió musical. Les duracions o post-esdeveniments que
segueixen immediatament canvien aquesta interpretació. És millor
evitar els predicats excessivament permissius com scheme?
quan l’aplicació requeriria tipus d’arguments més específics.
Per veure una llista dels predicats de tipus disponibles, consulteu Predicats de tipus predefinits.
Vegeu també
Referencia de la notació: Predicats de tipus predefinits.
Fitxers instal·lats: lily/music-scheme.cc, scm/c++.scm, scm/lily.scm.
[ << Interfícies per a programadors ] | [Top][Contents][Index] | [ Interfícies de l’Scheme del LilyPond >> ] |
[ < Funcions de l’Scheme ] | [ Up: Funcions de l’Scheme ] | [ Ús de les funcions de l’Scheme > ] |