[ << Tutorial de l’Scheme ] | [Top][Contents][Index] | [ Interfícies per a programadors >> ] |
[ < Scheme dins del LilyPond ] | [ Up: Scheme dins del LilyPond ] | [ Variables del 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 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))
[ << Tutorial de l’Scheme ] | [Top][Contents][Index] | [ Interfícies per a programadors >> ] |
[ < Scheme dins del LilyPond ] | [ Up: Scheme dins del LilyPond ] | [ Variables del LilyPond > ] |