A.2.1 Sintaxi de l’Scheme del LilyPond (Extender LilyPond)

#### A.2.1 Sintaxi de l’Scheme del LilyPond

L’intèrpret Guile forma part del LilyPond, cosa que significa que es pot incloure Scheme dins dels fitxers d’entrada del LilyPond. Hi ha diversos mètodes per incloure Scheme dins del LilyPond.

La manera més fàcil és utilitzar el símbol de coixinet `#` abans d’una expressió de l’Scheme.

Ara bé, el codi d’entrada del LilyPond s’estructura en elements i expressions, de forma semblant a com el llenguatge humà s’estructura en paraules i frases. El LilyPond té un analitzador lèxic que reconeix elements indivisibles (nombres literals, cadenes de text, elements de l’Scheme, noms de nota, etc.), i un analitzador que entén la sintaxi. Un cop que sap que s’aplica una regla sintàctica concreta, executa les accions associades amb ella.

El mètode del símbol coixinet `#` per incrustar Scheme s’adapta de forma natural a aquest sistema. Un cop que l’analitzador lèxic veu un símbol de coixinet, crida al lector de l’Scheme perquè llegeixi una expressió de l’Scheme completa (que pot ser un identificador, una expressió envoltada entre parèntesis, o algunes altes coses). Després que s’hagi llegit l’expressió de l’Scheme, s’emmagatzema com el valor d’un element `SCM_TOKEN` de la gramàtica. Després que el analitzador sintàctic ja sap com fer ús d’aquest element, crida a Guile perquè avaluï l’expressió de Scheme. Atès que l’analitzador sintàctic sol requerir una mica de lectura per endavant per part de l’analitzador lèxic per prendre les seves decisions d’anàlisi sintàctica, aquesta separació de lectura i avaluació entre els analitzadors lèxic i sintàctic és justament el que cal per mantenir sincronitzades les execucions d’expressions del LilyPond i de l’Scheme. Per aquest motiu s’ha d’usar el símbol de coixinet `#` per cridar a l’Scheme sempre que sigui possible.

Una altra forma de cridar a l’intèrpret de l’Scheme des del LilyPond és l’ús del símbol de dòlar `$` enlloc del coixinet per introduir les expressions de l’Scheme. En aquest cas, el LilyPond avalua el codi just després que l’analitzador lèxic l’hagi llegit. Comprova el tipus resultant de l’expressió de l’Scheme i després selecciona un tipus d’element (un dels diversos elements `xxx_IDENTIFIER` dins de la sintaxi) per a ell. Crea una còpia del valor i l’usa com a valor de l’element. Si el valor de l’expressió és buit (El valor del Guile de `*unspecified*`), no es passa res en absolut a l’analitzador sintàctic.

Aquest és, de fet, el mateix mecanisme exactament que el LilyPond fa servir quan cridem a qualsevol variable o funció musical pel seu nom, com `\nom`, amb l’única diferència que el nom ve determinat per l’analitzador lèxic del LilyPond sense consultar al lector de l’Scheme, i així solament s’accepten els noms de variable consistents amb el mode actual del LilyPond.

L’acció immediata de `$` pot portar a alguna que altra sorpresa, vegeu Importació de l’Scheme dins del LilyPond. La utilització de `#` on l’analitzador sintàctic li dóna suport és normalment preferible. Dins de les expressions musicals, aquelles que es creen utilitzant `#` s’interpreten com a música. No obstant, no es copien abans de ser utilitzades. Si formen part d’alguna estructura que encara podria tenir algun ús, potser hàgiu de fer servir explícitament `ly:music-deep-copy`.

També hi ha els operadors de ‘divisió de llistes’ `$@` i `#@` que insereixen tots els elements d’una llista dins del context que l’envolta.

Ara fem una ullada a alguna cosa de codi de l’Scheme real. Els procediments de l’Scheme es poden definir dins dels fitxers d’entrada del LilyPond:

    #(define (mitjana a b c) (/ (+ a b c) 3))

Observeu que els comentaris del LilyPond (`%` y `%{ %}`) no es poden utilitzar dins del codi de l’Scheme, ni tan sols dins d’un fitxer d’entrada del LilyPond, perquè és l’intèrpret Guile, i no l’analitzador lèxic del LilyPond, el que està llegint l’expressió de l’Scheme. Els comentaris a l’Scheme del Guile s’introdueixen de la manera següent:

    ; això és un comentari d'una línia

    #!
      Això és un comentari de bloc (que no es pot niuar) estil Guile
      Però s'usen en comptades ocasions pels Schemer i mai dins
      del codi fon del LilyPond
    !#

Durant la resta d’aquesta secció suposarem que les dades s’introdueixen en un fitxer de música, per la qual cosa afegim un coixinet `#` al principi de cada una de les expressions de l’Scheme.

Totes les expressions de l’Scheme del nivell jeràrquic superior dins d’un fitxer d’entrada del LilyPond es poden combinar en una sola expressió de l’Scheme mitjançant la utilització de l’operador `begin`:

    #(begin
      (define Pep 0)
      (define Pepet 1))

#### 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