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 Shcme 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, la Gramàtica del Lilypond (LilyPond grammar). 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 actul 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 tener 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.25.27 (development-branch).