B.2.1 Definició de funcions de l’Scheme (Extender LilyPond)

#### 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 `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.26.0 (stable-branch).

- Appendix A Tutorial de l’Scheme
  - A.1 Introducció a l’Scheme
    - A.1.1 Banc de sorra de l’Scheme
    - A.1.2 Variables de l’Scheme
    - A.1.3 Tipus de dades simples de l’Scheme
    - A.1.4 Tipus de dades compostes de l’Scheme
      - Parelles
      - Llistes
      - Llistes associatives (llistes-A)
      - Taules de hash
    - A.1.5 Càlculs a l’Scheme
    - A.1.6 Procediments de l’Scheme
      - Definició de procediments
      - Predicats
      - Valors de retorn
    - A.1.7 Condicionals de l’Scheme
      - if
      - cond
  - A.2 Scheme dins del LilyPond
    - A.2.1 Sintaxi de l’Scheme del LilyPond
    - A.2.2 Variables del LilyPond
    - A.2.3 Variables d’entrada i l’Scheme
    - A.2.4 Importació de l’Scheme dins del LilyPond
    - A.2.5 Propietats dels objectes
    - A.2.6 Variables del LilyPond compostes
      - Desplaçaments
      - Fraccions
      - Dimensions
      - Llistes-A de propietats
      - Cadenes de llistes-A
    - A.2.7 Representació interna de la música
  - A.3 Construcció de funcions complicades
    - A.3.1 Presentació de les expressions musicals
    - A.3.2 Propietats musicals
    - A.3.3 Duplicació una nota amb lligadures (exemple)
    - A.3.4 Afegir articulacions a les notes (exemple)
- B Interfícies per a programadors
  - B.1 Blocs de codi del LilyPond
  - B.2 Funcions de l’Scheme
    - B.2.1 Definició de funcions de l’Scheme
    - B.2.2 Ús de les funcions de l’Scheme
    - B.2.3 Funcions de l’Scheme buides
  - B.3 Funcions musicals
    - B.3.1 Definicions de funcions musicals
    - B.3.2 Ús de les funcions musicals
    - B.3.3 Funcions de substitució senzilles
    - B.3.4 Funcions de substitució intermèdies
    - B.3.5 Matemàtiques dins de les funcions
    - B.3.6 Funcions sense arguments
    - B.3.7 Funcions musicals buides
  - B.4 Funcions d’esdeveniments
  - B.5 Funcions de marcatge
    - B.5.1 Construcció d’elements de marcatge a l’Scheme
    - B.5.2 Com funcionen internament els elements de marcatge
    - B.5.3 Definició d’una ordre nova de marcatge
      - Sintaxi de la definició d’ordre de marcatge
      - Quant a les propietats
      - Un exemple complet
      - Adaptació d’ordres incorporades
    - B.5.4 Definició de noves ordres de llista de marcatge
  - B.6 Contextos per a programadors
    - B.6.1 Avaluació de contextos
    - B.6.2 Execució d’una funció sobre tots els objectes de la presentació
  - B.7 Funcions de callback
  - B.8 Ajustaments difícils
- C Interfícies de l’Scheme del LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índex del LilyPond