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

argNn-è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.
cosuna 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 origin útil.

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.


Extender LilyPond v2.25.27 (development-branch).