]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/es/extending/scheme-tutorial.itely
ba196bca6159ae26a7cb330e3e3b6cc4bdd69b3d
[lilypond.git] / Documentation / es / extending / scheme-tutorial.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
2
3 @ignore
4     Translation of GIT committish: bfd8ed4084a441d9ac65b1b088f3b54f31ae40c6
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  For details, see the Contributors'
8     Guide, node Updating translation committishes..
9 @end ignore
10
11 @c \version "2.19.22"
12
13 @node Tutorial de Scheme
14 @appendix Tutorial de Scheme
15 @translationof Scheme tutorial
16
17 @cindex Scheme
18 @cindex GUILE
19 @cindex Scheme, código en línea
20 @cindex acceder a Scheme
21 @cindex evaluar Scheme
22 @cindex LISP
23
24 LilyPond utiliza el lenguaje de programación Scheme, tanto como
25 parte de la sintaxis del código de entrada, como para servir de
26 mecanismo interno que une los módulos del programa entre sí.  Esta
27 sección es una panorámica muy breve sobre cómo introducir datos en
28 Scheme.  Si quiere saber más sobre Scheme, consulte
29 @uref{http://@/www@/.schemers@/.org}.
30
31 LilyPond utiliza la implementación GNU Guile de Scheme, que está
32 basada en el estándar @qq{R5RS} del lenguaje.  Si está aprendiendo
33 Scheme para usarlo con LilyPond, no se recomienda trabajar con una
34 implementación distinta (o que se refiera a un estándar
35 diferente).  Hay información sobre Guile en
36 @uref{http://www.gnu.org/software/guile/}.  El estándar de Scheme
37 @qq{R5RS} se encuentra en
38 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
39
40 @menu
41 * Introducción a Scheme::
42 * Scheme dentro de LilyPond::
43 * Construir funciones complicadas::
44 @end menu
45
46 @node Introducción a Scheme
47 @section Introducción a Scheme
48 @translationof Introduction to Scheme
49
50 Comenzaremos con una introducción a Scheme.  Para esta breve
51 introducción utilizaremos el intérprete GUILE para explorar la
52 manera en que el lenguaje funciona.  Una vez nos hayamos
53 familiarizado con Scheme, mostraremos cómo se puede integrar el
54 lenguaje en los archivos de LilyPond.
55
56
57 @menu
58 * Cajón de arena de Scheme::
59 * Variables de Scheme::
60 * Tipos de datos simples de Scheme::
61 * Tipos de datos compuestos de Scheme::
62 * Cálculos en Scheme::
63 * Procedimientos de Scheme::
64 * Condicionales de Scheme::
65 @end menu
66
67 @node Cajón de arena de Scheme
68 @subsection Cajón de arena de Scheme
69 @translationof Scheme sandbox
70
71 La instalación de LilyPond incluye también la de la implementación
72 Guile de Scheme.  Sobre casi todos los sistemas puede experimentar
73 en una @qq{caja de arena} de Scheme abriendo una ventana del
74 terminal y tecleando @q{guile}.  En algunos sistemas, sobre todo
75 en Windows, podría necesitar ajustar la variable de entorno
76 @code{GUILE_LOAD_PATH} a la carpeta @code{../usr/share/guile/1.8}
77 dentro de la instalación de LilyPond (para conocer la ruta
78 completa a esta carpeta, consulte
79 @rlearning{Otras fuentes de información}).  Como alternativa, los
80 usuarios de Windows pueden seleccionar simplemente @q{Ejecutar}
81 del menú Inicio e introducir @q{guile}.
82
83 Sin embargo, está disponible un cajón de arena de Scheme listo
84 para funcionar con todo LilyPond cargado, con esta instrucción de
85 la línea de órdenes:
86 @example
87 lilypond scheme-sandbox
88 @end example
89
90 @noindent
91 Una vez está funcionando el cajón de arena, verá un indicador
92 del sistema de Guile:
93
94 @lisp
95 guile>
96 @end lisp
97
98 Podemos introducir expresiones de Scheme en este indicador para
99 experimentar con Scheme.  Si quiere usar la biblioteca readline de
100 GNU para una más cómoda edición de la línea de órdenes de Scheme,
101 consulte el archivo @file{ly/scheme-sandbox.ly} para más
102 información.  Si ya ha activado la biblioteca readline para las
103 sesiones de Guile interactivas fuera de LilyPond, debería
104 funcionar también en el cajón de arena.
105
106 @node Variables de Scheme
107 @subsection Variables de Scheme
108 @translationof Scheme variables
109
110 Las variables de Scheme pueden tener cualquier valor válido de
111 Scheme, incluso un procedimiento de Scheme.
112
113 Las variables de Scheme se crean con @code{define}:
114
115 @lisp
116 guile> (define a 2)
117 guile>
118 @end lisp
119
120 Las variables de Scheme se pueden evaluar en el indicador del
121 sistema de guile, simplemente tecleando el nombre de la variable:
122
123 @lisp
124 guile> a
125 2
126 guile>
127 @end lisp
128
129 Las variables de Scheme se pueden imprimir en la pantalla
130 utilizando la función display:
131
132 @lisp
133 guile> (display a)
134 2guile>
135 @end lisp
136
137 @noindent
138 Observe que el valor @code{2} y el indicador del sistema
139 @code{guile} se muestran en la misma línea.  Esto se puede evitar
140 llamando al procedimiento de nueva línea o imprimiendo un carácter
141 de nueva línea.
142
143 @lisp
144 guile> (display a)(newline)
145 2
146 guile> (display a)(display "\n")
147 2
148 guile>
149 @end lisp
150
151 Una vez que se ha creado una variable, su valor se puede modificar
152 con @code{set!}:
153
154 @lisp
155 guile> (set! a 12345)
156 guile> a
157 12345
158 guile>
159 @end lisp
160
161 @node Tipos de datos simples de Scheme
162 @subsection Tipos de datos simples de Scheme
163 @translationof Scheme simple data types
164
165 El concepto más básico de un lenguaje son sus tipos de datos:
166 números, cadenas de caracteres, listas, etc.  He aquí una lista de
167 los tipos de datos que son de relevancia respecto de la entrada de
168 LilyPond.
169
170 @table @asis
171 @item Booleanos
172 Los valores Booleanos son Verdadero y Falso.  Verdadero en Scheme es
173 @code{#t} y Falso es @code{#f}.
174 @funindex ##t
175 @funindex ##f
176
177 @item Números
178 Los números se escriben de la forma normal, @code{1} es el número
179 (entero) uno, mientras que @w{@code{-1.5}} es un número en coma
180 flotante (un número no entero).
181
182 @item Cadenas
183 Las cadenas se encierran entre comillas:
184
185 @example
186 "esto es una cadena"
187 @end example
188
189 Las cadenas pueden abarcar varias líneas:
190
191 @example
192 "esto
193 es
194 una cadena"
195 @end example
196
197 @noindent
198 y los caracteres de nueva línea al final de cada línea se
199 incluirán dentro de la cadena.
200
201 Los caracteres de nueva línea también se pueden añadir mediante la
202 inclusión de @code{\n} en la cadena.
203
204 @example
205 "esto\nes una\ncadena de varias líneas"
206 @end example
207
208
209 Las comillas dobles y barras invertidas se añaden a las cadenas
210 precediéndolas de una barra invertida.  La cadena @code{\a dijo
211 "b"} se introduce como
212
213 @example
214 "\\a dijo \"b\""
215 @end example
216
217 @end table
218
219 Existen más tipos de datos de Scheme que no se estudian aquí.
220 Para ver un listado completo, consulte la guía de referencia de
221 Guile,
222 @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}.
223
224 @node Tipos de datos compuestos de Scheme
225 @subsection Tipos de datos compuestos de Scheme
226 @translationof Scheme compound data types
227
228 También existen tipos de datos compuestos en Scheme.  Entre los
229 tipos más usados en la programación de LilyPond se encuentran las
230 parejas, las listas, las listas-A y las tablas de hash.
231
232 @menu
233 * Parejas::
234 * Listas::
235 * Listas asociativas (listas-A)::
236 * Tablas de hash::
237 @end menu
238
239 @node Parejas
240 @unnumberedsubsubsec Parejas
241 @translationof Pairs
242
243 El tipo fundacional de datos compuestos de Scheme es la
244 @code{pareja}.  Como se espera por su nombre, una pareja son dos
245 valores unidos en uno solo.  El operador que se usa para formar
246 una pareja se llama @code{cons}.
247
248 @lisp
249 guile> (cons 4 5)
250 (4 . 5)
251 guile>
252 @end lisp
253
254 Observe que la pareja se imprime como dos elementos rodeados por
255 paréntesis y separados por un espacio, un punto (@code{.}) y otro
256 espacio.  El punto @emph{no es} un punto decimal, sino más bien un
257 indicador de pareja.
258
259 Las parejas también se pueden introducir como valores literales
260 precediéndolos de un carácter de comilla simple o apóstrofo.
261
262 @lisp
263 guile> '(4 . 5)
264 (4 . 5)
265 guile>
266 @end lisp
267
268 Los dos elementos de una pareja pueden ser cualquier valor válido
269 de Scheme:
270
271 @lisp
272 guile> (cons #t #f)
273 (#t . #f)
274 guile> '("bla-bla" . 3.1415926535)
275 ("bla-bla" . 3.1415926535)
276 guile>
277 @end lisp
278
279 Se puede accede al primero y segundo elementos de la pareja
280 mediante los procedimientos de Scheme @code{car} y @code{cdr},
281 respectivamente.
282
283 @lisp
284 guile> (define mipareja (cons 123 "Hola")
285 @dots{} )
286 guile> (car mipareja)
287 123
288 guile> (cdr mipareja)
289 "Hola"
290 guile>
291 @end lisp
292
293 @noindent
294
295 Nota: @code{cdr} se pronuncia "could-er", según Sussman y Abelson,
296 véase
297 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
298
299 @node Listas
300 @unnumberedsubsubsec Listas
301 @translationof Lists
302
303 Una estructura de datos muy común en Scheme es la
304 @emph{lista}. Formalmente, una lista @q{bien hecha} se define como
305 la lista vacía, representada como @code{'()} y con longitud cero,
306 o bien como una pareja cuyo @code{cdr} es a su vez una lista más
307 corta.
308
309 Existen muchas formas de crear listas.  Quizá la más común es con
310 el procedimiento @code{list}:
311
312 @lisp
313 guile> (list 1 2 3 "abc" 17.5)
314 (1 2 3 "abc" 17.5)
315 @end lisp
316
317 Como se ve, una lista se imprime en la forma de elementos
318 individuales separados por espacios y encerradas entre paréntesis.
319 A diferencia de las parejas, no hay ningún punto entre los
320 elementos.
321
322 También se puede escribir una lista como una lista literal
323 encerrando sus elementos entre paréntesis y añadiendo un
324 apóstrofo:
325
326 @lisp
327 guile> '(17 23 "fulano" "mengano" "zutano")
328 (17 23 "fulano" "mengano" "zutano")
329 @end lisp
330
331 Las listas son una parte fundamental de Scheme.  De hecho, Scheme
332 se considera un dialecto de Lisp, donde @q{lisp} es una
333 abreviatura de @q{List Processing} (proceso de listas).  Todas las
334 expresiones de Scheme son listas.
335
336
337 @node Listas asociativas (listas-A)
338 @unnumberedsubsubsec Listas asociativas (listas-A)
339 @translationof Association lists (alists)
340
341 Un tipo especial de listas son las @emph{listas asociativas} o
342 @emph{listas-A}.  Se puede usar una lista-A para almacenar datos
343 para su fácil recuperación posterior.
344
345 Las listas-A son listas cuyos elementos son parejas.  El
346 @code{car} de cada elemento se llama @emph{clave}, y el @code{cdr}
347 de cada elemento se llama @emph{valor}.  El procedimiento de
348 Scheme @code{assoc} se usa para recuperar un elemento de la
349 lista-A, y @code{cdr} se usa para recuperar el valor:
350
351 @lisp
352 guile> (define mi-lista-a '((1  . "A") (2 . "B") (3 . "C")))
353 guile> mi-lista-a
354 ((1 . "A") (2 . "B") (3 . "C"))
355 guile> (assoc 2 mi-lista-a)
356 (2 . "B")
357 guile> (cdr (assoc 2 mi-lista-a))
358 "B"
359 guile>
360 @end lisp
361
362 Las listas-A se usan mucho en LilyPond para almacenar propiedades
363 y otros datos.
364
365
366 @node Tablas de hash
367 @unnumberedsubsubsec Tablas de hash
368 @translationof Hash tables
369
370 Estructuras de datos que se utilizan en LilyPond de forma
371 ocasional.  Una tabla de hash es similar a una matriz, pero los
372 índices de la matriz pueden ser cualquier tipo de valor de Scheme,
373 no sólo enteros.
374
375 Las tablas de hash son más eficientes que las listas-A si hay una
376 gran cantidad de datos que almacenar y los datos cambian con muy
377 poca frecuencia.
378
379 La sintaxis para crear tablas de hash es un poco compleja, pero
380 veremos ejemplos de ello en el código fuente de LilyPond.
381
382 @lisp
383 guile> (define h (make-hash-table 10))
384 guile> h
385 #<hash-table 0/31>
386 guile> (hashq-set! h 'key1 "val1")
387 "val1"
388 guile> (hashq-set! h 'key2 "val2")
389 "val2"
390 guile> (hashq-set! h 3 "val3")
391 "val3"
392 @end lisp
393
394 Los valores se recuperan de las tablas de hash mediante
395 @code{hashq-ref}.
396
397 @lisp
398 guile> (hashq-ref h 3)
399 "val3"
400 guile> (hashq-ref h 'key2)
401 "val2"
402 guile>
403 @end lisp
404
405 Las claves y los valores se recuperan como una pareja con
406 @code{hashq-get-handle}.  Ésta es la forma preferida, porque
407 devuelve @code{#f} si no se encuentra la clave.
408
409 @lisp
410 guile> (hashq-get-handle h 'key1)
411 (key1 . "val1")
412 guile> (hashq-get-handle h 'frob)
413 #f
414 guile>
415 @end lisp
416
417 @node Cálculos en Scheme
418 @subsection Cálculos en Scheme
419 @translationof Calculations in Scheme
420
421 @ignore
422 Todo el tiempo hemos estado usando listas.  Un cálculo, como @code{(+
423 1 2)} también es una lista (que contiene el símbolo @code{+} y los
424 números 1 y@tie{}2).  Normalmente, las listas se interpretan como
425 cálculos, y el intérprete de Scheme sustituye el resultado del
426 cálculo.  Para escribir una lista, detenemos la evaluación.  Esto se
427 hace precediendo la lista por un apóstrofo @code{'}.  Así, para los
428 cálculos no usamos ningún apóstrofo.
429
430 Dentro de una lista o pareja precedida de apóstrofo, no hay necesidad
431 de escribir ningún apóstrofo más.  Lo siguiente es una pareja de
432 símbolos, una lista de símbolos y una lista de listas respectivamente:
433
434 @example
435 #'(stem . head)
436 #'(staff clef key-signature)
437 #'((1) (2))
438 @end example
439 @end ignore
440
441 Scheme se puede usar para hacer cálculos.  Utiliza sintaxis
442 @emph{prefija}.  Sumar 1 y@tie{}2 se escribe como @code{(+ 1 2)} y
443 no como el tradicional @math{1+2}.
444
445 @lisp
446 guile> (+ 1 2)
447 3
448 @end lisp
449
450 Los cálculos se pueden anidar; el resultado de una función se
451 puede usar para otro cálculo.
452
453 @lisp
454 guile> (+ 1 (* 3 4))
455 13
456 @end lisp
457
458 Estos cálculos son ejemplos de evaluaciones; una expresión como
459 @code{(* 3 4)} se sustituye por su valor @code{12}.
460
461 Los cálculos de Scheme son sensibles a las diferencias entre
462 enteros y no enteros.  Los cálculos enteros son exactos, mientras
463 que los no enteros se calculan con los límites de precisión
464 adecuados:
465
466 @lisp
467 guile> (/ 7 3)
468 7/3
469 guile> (/ 7.0 3.0)
470 2.33333333333333
471 @end lisp
472
473 Cuando el intérprete de Scheme encuentra una expresión que es una
474 lista, el primer elemento de la lista se trata como un
475 procedimiento a evaluar con los argumentos del resto de la lista.
476 Por tanto, todos los operadores en Scheme son operadores prefijos.
477
478 Si el primer elemento de una expresión de Scheme que es una lista
479 que se pasa al intérprete @emph{no es} un operador o un
480 procedimiento, se produce un error:
481
482 @lisp
483 guile> (1 2 3)
484
485 Backtrace:
486 In current input:
487   52: 0* [1 2 3]
488
489 <unnamed port>:52:1: In expression (1 2 3):
490 <unnamed port>:52:1: Wrong type to apply: 1
491 ABORT: (misc-error)
492 guile>
493 @end lisp
494
495 Aquí podemos ver que el intérprete estaba intentando tratar el 1
496 como un operador o procedimiento, y no pudo hacerlo.  De aquí que
497 el error sea "Wrong type to apply: 1".
498
499 Así pues, para crear una lista debemos usar el operador de lista,
500 o podemos precederla de un apóstrofo para que el intérprete no
501 trate de evaluarla.
502
503 @lisp
504 guile> (list 1 2 3)
505 (1 2 3)
506 guile> '(1 2 3)
507 (1 2 3)
508 guile>
509 @end lisp
510
511 Esto es un error que puede aparecer cuando trabaje con Scheme
512 dentro de LilyPond.
513
514 @ignore
515 La misma asignación se puede hacer también completamente en Scheme,
516
517 @example
518 #(define veintiCuatro (* 2 doce))
519 @end example
520
521 @c this next section is confusing -- need to rewrite
522
523 El @emph{nombre} de una variable también es una expresión, similar a
524 un número o una cadena.  Se introduce como
525
526 @example
527 #'veintiCuatro
528 @end example
529
530 @funindex #'symbol
531 @cindex comillas en Scheme
532
533 El apóstrofo @code{'} evita que el intérprete de Scheme sustituya
534 @code{veintiCuatro} por @code{24}.  En vez de esto, obtenemos el
535 nombre @code{veintiCuatro}.
536 @end ignore
537
538
539 @node Procedimientos de Scheme
540 @subsection Procedimientos de Scheme
541 @translationof Scheme procedures
542
543 Los procedimientos de Scheme son expresiones de Scheme ejecutables
544 que devuelven un valor resultante de su ejecución.  También pueden
545 manipular variables definidas fuera del procedimiento.
546
547 @menu
548 * Definir procedimientos::
549 * Predicados::
550 * Valores de retorno::
551 @end menu
552
553 @node Definir procedimientos
554 @unnumberedsubsubsec Definir procedimientos
555 @translationof Defining procedures
556
557 Los procedimientos se definen en Scheme con @code{define}:
558
559 @example
560 (define (nombre-de-la-función arg1 arg2 ... argn)
561  expresión-de-scheme-que-devuelve-un-valor)
562 @end example
563
564 Por ejemplo, podemos definir un procedimiento para calcular la
565 media:
566
567 @lisp
568 guile> (define (media x y) (/ (+ x y) 2))
569 guile> media
570 #<procedure media (x y)>
571 @end lisp
572
573 Una vez se ha definido un procedimiento, se llama poniendo el
574 nombre del procedimiento dentro de una lista.  Por ejemplo,
575 podemos calcular la media de 3 y 12:
576
577 @lisp
578 guile> (media 3 12)
579 15/2
580 @end lisp
581
582
583 @node Predicados
584 @unnumberedsubsubsec Predicados
585 @translationof Predicates
586
587 Los procedimientos de Scheme que devuelven valores booleanos se
588 suelen llamar @emph{predicados}.  Por convenio (pero no por
589 necesidad), los nombres de predicados acaban en un signo de
590 interrogación:
591
592 @lisp
593 guile> (define (menor-que-diez? x) (< x 10))
594 guile> (menor-que-diez? 9)
595 #t
596 guile> (menor-que-diez? 15)
597 #f
598 @end lisp
599
600
601 @node Valores de retorno
602 @unnumberedsubsubsec Valores de retorno
603 @translationof Return values
604
605 Los procedimientos de Scheme siempre devuelven un valor de
606 retorno, que es el valor de la última expresión ejecutada en el
607 procedimiento.  El valor de retorno puede ser cualquier valor de
608 Scheme válido, incluso una estructura de datos compleja o un
609 procedimiento.
610
611 A veces, el usuario quiere tener varias expresiones de Scheme
612 dentro de un procedimiento.  Existen dos formas en que se pueden
613 combinar distintas expresiones.  La primera es el procedimiento
614 @code{begin}, que permite evaluar varias expresiones, y devuelve
615 el valor de la última expresión.
616
617 @lisp
618 guile> (begin (+ 1 2) (- 5 8) (* 2 2))
619 4
620 @end lisp
621
622 La segunda forma de combinar varias expresiones es dentro de un
623 bloque @code{let}.  Dentro de un bloque let, se crean una serie de
624 ligaduras o asignaciones, y después se evalúa una secuencia de
625 expresiones que pueden incluir esas ligaduras o asignaciones.  El
626 valor de retorno del bloque let es el valor de retorno de la
627 última sentencia del bloque let:
628
629 @lisp
630 guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
631 @dots{} (+ (* x y) (/ z x)))
632 508
633 @end lisp
634
635
636 @node Condicionales de Scheme
637 @subsection Condicionales de Scheme
638 @translationof Scheme conditionals
639
640 @menu
641 * if::
642 * cond::
643 @end menu
644
645 @node if
646 @unnumberedsubsubsec if
647 @translationof if
648
649 Scheme tiene un procedimiento @code{if}:
650
651 @example
652 (if expresión-de-prueba expresión-de-cierto expresión-de-falso)
653 @end example
654
655 @var{expresión-de-prueba} es una expresión que devuelve un valor
656 booleano.  Si @var{expresión-de-prueba} devuelve @code{#t}, el
657 procedimiento @code{if} devuelve el valor de la
658 @var{expresión-de-cierto}, en caso contrario devuelve el valor de
659 la @var{expresión-de-falso}.
660
661 @lisp
662 guile> (define a 3)
663 guile> (define b 5)
664 guile> (if (> a b) "a es mayor que b" "a no es mayor que b")
665 "a no es mayor que b"
666 @end lisp
667
668
669 @node cond
670 @unnumberedsubsubsec cond
671 @translationof cond
672
673 Otro procedimiento condicional en Scheme es @code{cond}:
674
675 @example
676 (cond (expresión-de-prueba-1 secuencia-de-expresiones-resultante-1)
677       (expresión-de-prueba-2 secuencia-de-expresiones-resultante-2)
678       @dots{}
679       (expresión-de-prueba-n secuencia-de-expresiones-resultante-n))
680 @end example
681
682 Por ejemplo:
683
684 @lisp
685 guile> (define a 6)
686 guile> (define b 8)
687 guile> (cond ((< a b) "a es menor que b")
688 ...          ((= a b) "a es igual a b")
689 ...          ((> a b) "a es mayor que b"))
690 "a es menor que b"
691 @end lisp
692
693 @node Scheme dentro de LilyPond
694 @section Scheme dentro de LilyPond
695 @translationof Scheme in LilyPond
696
697 @menu
698 * Sintaxis del Scheme de LilyPond::
699 * Variables de LilyPond::
700 * Variables de entrada y Scheme::
701 * Importación de Scheme dentro de LilyPond::
702 * Propiedades de los objetos::
703 * Variables de LilyPond compuestas::
704 * Representación interna de la música::
705 @end menu
706
707 @node Sintaxis del Scheme de LilyPond
708 @subsection Sintaxis del Scheme de LilyPond
709 @translationof LilyPond Scheme syntax
710 @funindex $
711 @funindex #
712
713 El intérprete Guile forma parte de LilyPond, lo que significa que
714 se puede incluir Scheme dentro de los archivos de entrada de
715 LilyPond.  Existen varios métodos para incluir Scheme dentro de
716 LilyPond.
717
718 La manera más sencilla es utilizar el símbolo de
719 almohadilla@tie{}@code{#} antes de una expresión de Scheme.
720
721 Ahora bien, el código de entrada de LilyPond se estructura en
722 elementos y expresiones, de forma parecida a cómo el lenguaje
723 humano se estructura en palabras y frases.  LilyPond tiene un
724 analizador léxico que reconoce elementos indivisibles (números
725 literales, cadenas de texto, elementos de Scheme, nombres de nota,
726 etc.), y un analizador que entiende la sintaxis, la Gramática de
727 LilyPond (@rcontrib{LilyPond grammar}).  Una vez que sabe que se
728 aplica una regla sintáctica concreta, ejecuta las acciones
729 asociadas con ella.
730
731 El método del símbolo de almohadilla@tie{}@code{#} para incrustar
732 Scheme se adapta de forma natural a este sistema.  Una vez que el
733 analizador léxico ve un símbolo de almohadilla, llama al lector de
734 Scheme para que lea una expresión de Scheme completa (que puede
735 ser un identificador, una expresión encerrada entre paréntesis, o
736 algunas otras cosas).  Después de que se ha leído la expresión de
737 Scheme, se almacena como el valor de un elemento @code{SCM_TOKEN}
738 de la gramática.  Después de que el analizador sintáctico ya sabe
739 cómo hacer uso de este elemento, llama a Guila para que evalúe la
740 expresión de Scheme.  Dado que el analizador sintáctico suele
741 requerir un poco de lectura por delante por parte del analizador
742 léxico para tomar sus decisiones de análisis sintáctico, esta
743 separación de lectura y evaluación entre los analizadores léxico y
744 sintáctico es justamente lo que se necesita para mantener
745 sincronizadas las ejecuciones de expresiones de LilyPond y de
746 Scheme.  Por este motivo se debe usar el símbolo de
747 almohadilla@tie{}@code{#} para llamar a Scheme siempre que sea
748 posible.
749
750 Otra forma de llamar al intérprete de Scheme desde LilyPond es el
751 uso del símbolo de dólar@tie{}@code{$} en lugar de la almohadilla
752 para introducir las expresiondes de Scheme.  En este caso,
753 LilyPond evalúa el código justo después de que el analizador
754 léxico lo ha leído.  Comprueba el tipo resultante de la expresión
755 de Scheme y después selecciona un tipo de elemento (uno de los
756 varios elementos @code{xxx_IDENTIFIER} dentro de la sintaxis) para
757 él.  Crea una @emph{copia} del valor y la usa como valor del
758 elemento.  Si el valor de la expresión es vacío (El valor de Guile
759 de @code{*unspecified*}), no se pasa nada en absoluto al
760 analizador sintáctico.
761
762 Éste es, de hecho, el mismo mecanismo exactamente que LilyPond
763 emplea cuando llamamos a cualquier variable o función musical por
764 su nombre, como @code{\nombre}, con la única diferencia de que el
765 nombre viene determinado por el analizador léxico de LilyPond sin
766 consultar al lector de Scheme, y así solamente se aceptan los
767 nombres de variable consistentes con el modo actual de LilyPond.
768
769 La acción inmediata de @code{$} puede llevar a alguna que otra
770 sorpresa, véase @ref{Importación de Scheme dentro de LilyPond}.
771 La utilización de @code{#} donde el analizador sintáctico lo
772 contempla es normalmente preferible.  Dentro de las expresiones
773 musicales, aquellas que se crean utilizando @code{#} @emph{se
774 interprentan} como música.  Sin embargo, @emph{no se copian} antes
775 de ser utilizadas.  Si forman parte de alguna estructura que aún
776 podría tener algún uso, quizá tenga que utilizar explícitamente
777 @code{ly:music-deep-copy}.
778
779 @funindex $@@
780 @funindex #@@
781 También existen los operadores de @q{división de listas}
782 @code{$@@} y @code{#@@} que insertan todos los elementos de una
783 lista dentro del contexto circundante.
784
785 Ahora echemos un vistazo a algo de código de Scheme real.  Los
786 procedimientos de Scheme se pueden definir dentro de los archivos
787 de entrada de LilyPond:
788
789 @example
790 #(define (media a b c) (/ (+ a b c) 3))
791 @end example
792
793 Observe que los comentarios de LilyPond (@code{%} y @code{%@{
794 %@}}) no se pueden utilizar dentro del código de Scheme, ni
795 siquiera dentro de un archivo de entrada de LilyPond, porque es el
796 intérprete Guile, y no el analizador léxico de LilyPond, el que
797 está leyendo la expresión de Scheme.  Los comentarios en el Scheme
798 de Guile se introducen como sigue:
799
800 @example
801 ; esto es un comentario de una línea
802
803 #!
804   Esto es un comentario de bloque (no anidable) estilo Guile
805   Pero se usan rara vez por parte de los Schemers
806   y nunca dentro del código fuente de LilyPond
807 !#
808 @end example
809
810 Durante el resto de esta sección, supondremos que los datos se
811 introducen en un archivo de música, por lo que añadiremos una
812 almohadilla@tie{}@code{#} al principio de cada una de las
813 expresiones de Scheme.
814
815 Todas las expresiones de Scheme del nivel jerárquico superior
816 dentro de un archivo de entrada de LilyPond se pueden combinar en
817 una sola expresión de Scheme mediante la utilización del operador
818 @code{begin}:
819
820 @example
821 #(begin
822   (define fulanito 0)
823   (define menganito 1))
824 @end example
825
826
827 @node Variables de LilyPond
828 @subsection Variables de LilyPond
829 @translationof LilyPond variables
830
831 Las variables de LilyPond se almacenan internamente en la forma de
832 variables de Scheme.  Así,
833
834 @example
835 doce = 12
836 @end example
837
838 @noindent
839 equivale a
840
841 @example
842 #(define doce 12)
843 @end example
844
845 Esto significa que las variables de LilyPond están disponibles
846 para su uso dentro de expresiones de Scheme.  Por ejemplo,
847 podríamos usar
848
849 @example
850 veintiCuatro = (* 2 doce)
851 @end example
852
853 @noindent
854 lo que daría lugar a que el número 24 se almacenase dentro de la
855 variable @code{veintiCuatro} de LilyPond (y de Scheme).
856
857 La forma usual de referirse a las variables de LilyPond, es
858 llamarlas usando una barra invertida, es decir
859 @code{\veintiCuatro} (véase
860 @ref{Sintaxis del Scheme de LilyPond}).  Dado que esto crea una
861 copia para la mayor parte de los tipos internos de LilyPond,
862 concretamente las expresiones musicales, las funciones musicales
863 no sueln crear copias del material que ellas mismas modifican.
864 Por este motivo, las expresiones musicales dadas con @code{#} no
865 deberían, por lo general, contener material que no se haya creado
866 partiendo de cero o copiado explícitamente en lugar de estar
867 referenciado directamente.
868
869 @node Variables de entrada y Scheme
870 @subsection Variables de entrada y Scheme
871 @translationof Input variables and Scheme
872
873 El formato de entrada contempla la noción de variables: en el
874 siguiente ejemplo, se asigna una expresión musical a una variable
875 con el nombre @code{traLaLa}.
876
877 @example
878 traLaLa = @{ c'4 d'4 @}
879 @end example
880
881 @noindent
882
883 También hay una forma de ámbito: en el ejemplo siguiente, el
884 bloque @code{\layout} también contiene una variable
885 @code{traLaLa}, que es independiente de la @code{\traLaLa}
886 externa.
887
888 @example
889 traLaLa = @{ c'4 d'4 @}
890 \layout @{ traLaLa = 1.0 @}
891 @end example
892
893 @c
894 En efecto, cada archivo de entrada constituye un ámbito, y cada
895 bloque @code{\header}, @code{\midi} y @code{\layout} son ámbitos
896 anidados dentro del ámbito de nivel superior.
897
898 Tanto las variables como los ámbitos están implementados en el
899 sistema de módulos de GUILE.  A cada ámbito se adjunta un módulo
900 anónimo de Scheme.  Una asignación de la forma:
901
902 @example
903 traLaLa = @{ c'4 d'4 @}
904 @end example
905
906 @noindent
907 se convierte internamente en una definición de Scheme:
908
909 @example
910 (define traLaLa @var{Valor Scheme de `@code{@dots{}}'})
911 @end example
912
913 Esto significa que las variables de LilyPond y las variables de
914 Scheme se pueden mezclar con libertad.  En el ejemplo siguiente,
915 se almacena un fragmento de música en la variable @code{traLaLa},
916 y se duplica usando Scheme.  El resultado se importa dentro de un
917 bloque @code{\score} por medio de una segunda variable
918 @code{twice}:
919
920 @lilypond[verbatim]
921 traLaLa = { c'4 d'4 }
922
923 #(define newLa (map ly:music-deep-copy
924   (list traLaLa traLaLa)))
925 #(define twice
926   (make-sequential-music newLa))
927
928 \twice
929 @end lilypond
930
931 @c Due to parser lookahead
932
933 En realidad, éste es un ejemplo bastante interesante.  La
934 asignación solo tiene lugar después de que el analizador
935 sintáctico se ha asegurado de que no sigue nada parecido a
936 @code{\addlyrics}, de manera que necesita comprobar lo que viene a
937 continuación.  Lee el símbolo @code{#} y la expresión de Scheme
938 siguiente @emph{sin} evaluarla, de forma que puede proceder a la
939 asignación, y @emph{posteriormente} ejecutar el código de Scheme
940 sin problema.
941
942 @node Importación de Scheme dentro de LilyPond
943 @subsection Importación de Scheme dentro de LilyPond
944 @translationof Importing Scheme in LilyPond
945 @funindex $
946 @funindex #
947
948 El ejemplo anterior muestra cómo @q{exportar} expresiones
949 musicales desde la entrada al intérprete de Scheme.  Lo contrario
950 también es posible.  Colocándolo después de @code{$}, un valor de
951 Scheme se interpreta como si hubiera sido introducido en la
952 sintaxis de LilyPond.  En lugar de definir @code{\twice}, el
953 ejemplo anterior podría también haberse escrito como
954
955 @example
956 @dots{}
957 $(make-sequential-music newLa)
958 @end example
959
960 Podemos utilizar @code{$} con una expresión de Scheme en cualquier
961 lugar en el que usaríamos @code{\@var{nombre}} después de haber
962 asignado la expresión de Scheme a una variable @var{nombre}.  Esta
963 sustitución se produce dentro del @q{analizador léxico}, de manera
964 que LilyPond no llega a darse cuenta de la diferencia.
965
966 Sin embargo, existe un inconveniente, el de la medida del tiempo.
967 Si hubiésemos estado usando @code{$} en vez de @code{#} para
968 definir @code{newLa} en el ejemplo anterior, la siguiente
969 definición de Scheme habría fracasado porque @code{traLaLa} no
970 habría sido definida aún.  Para ver una explicación de este
971 problema de momento temporal, véase @ref{Sintaxis del Scheme de
972 LilyPond}.
973
974 @funindex $@@
975 @funindex #@@
976 Un conveniente aspecto posterior pueden ser los operadores de
977 @q{división de listas} @code{$@@} y @code{#@@} para la inserción
978 de los elementos de una lista dentro del contexto circundante.
979 Utilizándolos, la última parte del ejemplo se podría haber escrito
980 como
981
982 @example
983 @dots{}
984 @{ #@@newLa @}
985 @end example
986
987 Aquí, cada elemento de la lista que está almacenado en
988 @code{newLa} se toma en secuencia y se inserta en la lista, como
989 si hubiésemos escrito
990
991 @example
992 @{ #(first newLa) #(second newLa) @}
993 @end example
994
995 Ahora bien, en todas esas formas, el código de Scheme se evalúa en
996 el momento en que el código de entrada aún se está procesando, ya
997 sea en el analizador léxico o en el analizador sintáctico.  Si
998 necesitamos que se ejecute en un momento posterior, debemos
999 consultar @ref{Funciones de Scheme vacías}, o almacenarlo dentro
1000 de un procedimiento:
1001
1002 @example
1003 #(define (nopc)
1004   (ly:set-option 'point-and-click #f))
1005
1006 @dots{}
1007 #(nopc)
1008 @{ c'4 @}
1009 @end example
1010
1011 @knownissues
1012
1013 No es posible mezclar variables de Scheme y de LilyPond con la
1014 opción @option{--safe}.
1015
1016
1017 @node Propiedades de los objetos
1018 @subsection Propiedades de los objetos
1019 @translationof Object properties
1020
1021 Las propiedades de los objetos se almacenan en LilyPond en forma
1022 de cadenas de listas-A, que son listas de listas-A.  Las
1023 propiedades se establecen añadiendo valores al principio de la
1024 lista de propiedades.  Las propiedades se leen extrayendo valores
1025 de las listas-A.
1026
1027 El establecimiento de un valor nuevo para una propiedad requiere
1028 la asignación de un valor a la lista-A con una clave y un valor.
1029 La sintaxis de LilyPond para hacer esto es la siguiente:
1030
1031 @example
1032 \override Stem.thickness = #2.6
1033 @end example
1034
1035 Esta instrucción ajusta el aspecto de las plicas.  Se añade una
1036 entrada de lista-A @code{'(thickness . 2.6)} a la lista de
1037 propiedades de un objeto @code{Stem}.  @code{thickness} se mide a
1038 partir del grosor de las líneas del pentagrama, y así estas plicas
1039 serán @code{2.6} veces el grosor de las líneas del pentagrama.
1040 Esto hace que las plicas sean casi el doble de gruesas de lo
1041 normal.  Para distinguir entre las variables que se definen en los
1042 archivos de entrada (como @code{veintiCuatro} en el ejemplo
1043 anterior) y las variables de los objetos internos, llamaremos a
1044 las últimas @q{propiedades} y a las primeras @q{variables.}  Así,
1045 el objeto plica tiene una propiedad @code{thickness} (grosor),
1046 mientras que @code{veintiCuatro} es una variable.
1047
1048 @cindex propiedades frente a variables
1049 @cindex variables frente a propiedades
1050
1051 @c  todo -- here we're getting interesting.  We're now introducing
1052 @c  LilyPond variable types.  I think this deserves a section all
1053 @c  its own
1054
1055 @node Variables de LilyPond compuestas
1056 @subsection Variables de LilyPond compuestas
1057 @translationof LilyPond compound variables
1058
1059 @menu
1060 * Desplazamientos::
1061 * Fracciones::
1062 * Dimensiones::
1063 * Listas-A de propiedades::
1064 * Cadenas de listas-A::
1065 @end menu
1066
1067
1068 @node Desplazamientos
1069 @unnumberedsubsubsec Desplazamientos
1070 @translationof Offsets
1071
1072 Los desplazamientos bidimensionales (coordenadas X e Y) se
1073 almacenan como @emph{parejas}.  El @code{car} del desplazamiento
1074 es la coordenada X, y el @code{cdr} es la coordenada Y.
1075
1076 @example
1077 \override TextScript.extra-offset = #'(1 . 2)
1078 @end example
1079
1080 Esto asigna la pareja @code{(1 . 2)} a la propiedad
1081 @code{extra-offset} del objeto TextScript.  Estos números se miden
1082 en espacios de pentagrama, y así esta instrucción mueve el objeto
1083 un espacio de pentagrama a la derecha, y dos espacios hacia
1084 arriba.
1085
1086 Los procedimientos para trabajar con desplazamientos están en
1087 @file{scm/lily-library.scm}.
1088
1089 @node Fracciones
1090 @unnumberedsubsubsec Fracciones
1091 @subheading Fractions
1092
1093 Las fracciones tal y como se utilizan por parte de LilyPond se
1094 almacenan, de nuevo, como @emph{parejas}, esta vez de enteros sin
1095 signo.  Mientras que Scheme es capaz de representar números
1096 racionaes como un tipo nativo, musicalmente @samp{2/4} y
1097 @samp{1/2} no son lo mismo, y necesitamos poder distinguir entre
1098 ellos.  De igual forma, no existe el concepto de @q{fracciones}
1099 negativas en LilyPond.  Así pues, @code{2/4} en LilyPond significa
1100 @code{(2 . 4)} en Scheme, y @code{#2/4} en LilyPond significa
1101 @code{1/2} en Scheme.
1102
1103
1104 @node Dimensiones
1105 @unnumberedsubsubsec Dimensiones
1106 @translationof Extents
1107
1108 Las parejas se usan también para almacenar intervalos, que
1109 representan un rango de números desde el mínimo (el @code{car})
1110 hasta el máximo (el @code{cdr}).  Los intervalos se usan para
1111 almacenar las dimensiones en X y en Y de los objetos imprimibles.
1112 Para dimensiones en X, el @code{car} es la coordenada X de la
1113 parte izquierda, y el @code{cdr} es la coordenada X de la parte
1114 derecha.  Para las dimensiones en Y, el @code{car} es la
1115 coordenada inferior, y el @code{cdr} es la coordenada superior.
1116
1117 Los procedimientos para trabajar con intervalos están en
1118 @file{scm/lily-library.scm}.  Se deben usar estos procedimientos
1119 siempre que sea posible, para asegurar la consistencia del código.
1120
1121
1122 @node Listas-A de propiedades
1123 @unnumberedsubsubsec Listas-A de propiedades
1124 @translationof Property alists
1125
1126 Una lista-A de propiedades es una estructura de datos de LilyPond
1127 que es una lista-A cuyas claves son propiedades y cuyos valores
1128 son expresiones de Scheme que dan el valor deseado de la
1129 propiedad.
1130
1131 Las propiedades de LilyPond son símbolos de Scheme, como por
1132 ejemplo @code{'thickness}.
1133
1134
1135 @node Cadenas de listas-A
1136 @unnumberedsubsubsec Cadenas de listas-A
1137 @translationof Alist chains
1138
1139 Una cadena de listas-A es una lista que contiene listas-A de
1140 propiedades.
1141
1142 El conjunto de todas las propiedades que se aplican a un grob se
1143 almacena por lo general como una cadena de listas-A.  Para poder
1144 encontrar el valor de una propiedad determinada que debería tener
1145 un grob, se busca por todas las listas-A de la cadena, una a una,
1146 tratando de encontrar una entrada que contenga la clave de la
1147 propiedad.  Se devuelve la primera entrada de lista-A que se
1148 encuentre, y el valor es el valor de la propiedad.
1149
1150 El procedimiento de Scheme @code{chain-assoc-get} se usa
1151 normalmente para obtener los valores de propiedades.
1152
1153 @node Representación interna de la música
1154 @subsection Representación interna de la música
1155 @translationof Internal music representation
1156
1157 Internamente, la música se representa como una lista de Scheme.
1158 La lista contiene varios elementos que afectan a la salida
1159 impresa.  El análisis sintáctico es el proceso de convertir la
1160 música de la representación de entrada de LilyPond a la
1161 representación interna de Scheme.
1162
1163 Cuando se analiza una expresión musical, se convierte en un
1164 conjunto de objetos musicales de Scheme.  La propiedad definitoria
1165 de un objeto musical es que ocupa un tiempo.  El tiempo que ocupa
1166 se llama @emph{duración}.  Las duraciones se expresan como un
1167 número racional que mide la longitud del objeto musical en
1168 redondas.
1169
1170 Un objeto musical tiene tres clases de tipos:
1171 @itemize
1172 @item
1173 nombre musical: Cada expresión musical tiene un nombre.  Por
1174 ejemplo, una nota lleva a un @rinternals{NoteEvent}, y
1175 @code{\simultaneous} lleva a una @rinternals{SimultaneousMusic}.
1176 Hay una lista de todas las expresiones disponibles en el manual de
1177 Referencia de funcionamiento interno, bajo el epígrafe
1178 @rinternals{Music expressions}.
1179
1180 @item
1181 @q{type} (tipo) o interface: Cada nombre musical tiene varios
1182 @q{tipos} o interfaces, por ejemplo, una nota es un @code{event},
1183 pero también es un @code{note-event}, un @code{rhythmic-event}, y
1184 un @code{melodic-event}.  Todas las clases de música están
1185 listadas en el manual de Referencia de funcionamiento interno,
1186 bajo el epígrafe @rinternals{Music classes}.
1187
1188 @item
1189 objeto de C++: Cada objeto musical está representado por un objeto
1190 de la clase @code{Music} de C++.
1191 @end itemize
1192
1193 La información real de una expresión musical se almacena en
1194 propiedades.  Por ejemplo, un @rinternals{NoteEvent} tiene
1195 propiedades @code{pitch} y @code{duration} que almacenan la altura
1196 y la duración de esa nota.  Hay una lista de todas la propiedades
1197 disponibles en el manual de Referencia de funcionamiento interno,
1198 bajo el epígrafe @rinternals{Music properties}.
1199
1200 Una expresión musical compuesta es un objeto musical que contiene
1201 otros objetos musicales dentro de sus propiedades.  Se puede
1202 almacenar una lista de objetos dentro de la propiedad
1203 @code{elements} de un objeto musical, o un único objeto musical
1204 @q{hijo} dentro de la propiedad @code{element}.  Por ejemplo,
1205 @rinternals{SequentialMusic} tiene su hijo dentro de
1206 @code{elements}, y @rinternals{GraceMusic} tiene su argumento
1207 único dentro de @code{element}.  El cuerpo de una repetición se
1208 almacena dentro de la propiedad @code{element} de
1209 @rinternals{RepeatedMusic}, y las alternativas dentro de
1210 @code{elements}.
1211
1212 @node Construir funciones complicadas
1213 @section Construir funciones complicadas
1214 @translationof Building complicated functions
1215
1216 Esta sección explica cómo reunir la información necesaria para
1217 crear funciones musicales complicadas.
1218
1219 @menu
1220 * Presentación de las expresiones musicales::
1221 * Propiedades musicales::
1222 * Duplicar una nota con ligaduras (ejemplo)::
1223 * Añadir articulaciones a las notas (ejemplo)::
1224 @end menu
1225
1226
1227 @node Presentación de las expresiones musicales
1228 @subsection Presentación de las expresiones musicales
1229 @translationof Displaying music expressions
1230
1231 @cindex almacenamiento interno
1232 @cindex imprimir expresiones musicales
1233 @cindex representación interna, impresión de
1234 @cindex displayMusic
1235 @funindex \displayMusic
1236
1237 Si se está escribiendo una función musical, puede ser muy
1238 instructivo examinar cómo se almacena internamente una expresión
1239 musical.  Esto se puede hacer con la función musical
1240 @code{\displayMusic}.
1241
1242 @example
1243 @{
1244   \displayMusic @{ c'4\f @}
1245 @}
1246 @end example
1247
1248 @noindent
1249 imprime lo siguiente:
1250
1251 @example
1252 (make-music
1253   'SequentialMusic
1254   'elements
1255   (list (make-music
1256           'NoteEvent
1257           'articulations
1258           (list (make-music
1259                   'AbsoluteDynamicEvent
1260                   'text
1261                   "f"))
1262           'duration
1263           (ly:make-duration 2 0 1/1)
1264           'pitch
1265           (ly:make-pitch 0 0 0))))
1266 @end example
1267
1268 De forma predeterminada, LilyPond imprime estos mensajes sobre la
1269 consola junto al resto de los mensajes.  Para separar estos
1270 mensajes y guardar el resultado de @code{\display@{LOQUESEA@}},
1271 puede especificar que se use un puerto de salida opcional:
1272
1273 @example
1274 @{
1275   \displayMusic #(open-output-file "display.txt") @{ c'4\f @}
1276 @}
1277 @end example
1278
1279 Esto sobreescribe el archivo de salida anterior cada vez ques e
1280 llama; si necesitamos escribir más de una expresión, debemos usar
1281 una variable para el puerto y reutilizarla:
1282 @example
1283 @{
1284   port = #(open-output-file "display.txt")
1285   \displayMusic \port @{ c'4\f @}
1286   \displayMusic \port @{ d'4 @}
1287   #(close-output-port port)
1288 @}
1289 @end example
1290
1291 El manual de Guile describe los puertos detalladamente.  Solo es
1292 realmente necesario cerrar el puerto si necesitamos leer el
1293 archivo antes de que LilyPond termine; en el primer ejemplo, no
1294 nos hemos molestado en hacerlo.
1295
1296 Un poco de reformateo hace a la información anterior más fácil de
1297 leer:
1298
1299 @example
1300 (make-music 'SequentialMusic
1301   'elements (list
1302              (make-music 'NoteEvent
1303                'articulations (list
1304                                (make-music 'AbsoluteDynamicEvent
1305                                  'text
1306                                  "f"))
1307                'duration (ly:make-duration 2 0 1/1)
1308                'pitch    (ly:make-pitch 0 0 0))))
1309 @end example
1310
1311 Una secuencia musical @code{@{ @dots{} @}} tiene el nombre
1312 @code{SequentialMusic}, y sus expresiones internas se almacenan
1313 coma una lista dentro de su propiedad @code{'elements}.  Una nota
1314 se representa como un objeto @code{NoteEvent} (que almacena las
1315 propiedades de duración y altura) con información adjunta (en este
1316 caso, un evento @code{AbsoluteDynamicEvent} con una propiedad
1317 @code{"f"} de texto) almacenada en su propiedad
1318 @code{articulations}.
1319
1320 @funindex{\void}
1321
1322 @code{\displayMusic} devuelve la música que imprime en la consola,
1323 y por ello se interpretará al tiempo que se imprime en la consola.
1324 Para evitar la interpretación, escriba @code{\void} antes de
1325 @code{\displayMusic}.
1326
1327 @node Propiedades musicales
1328 @subsection Propiedades musicales
1329 @translationof Music properties
1330
1331 @ignore
1332 TODO -- make sure we delineate between @emph{music} properties,
1333 @emph{context} properties, and @emph{layout} properties.  These
1334 are potentially confusing.
1335 @end ignore
1336
1337 Veamos un ejemplo:
1338
1339 @example
1340 someNote = c'
1341 \displayMusic \someNote
1342 ===>
1343 (make-music
1344   'NoteEvent
1345   'duration
1346   (ly:make-duration 2 0 1/1)
1347   'pitch
1348   (ly:make-pitch 0 0 0))
1349 @end example
1350
1351 El objeto @code{NoteEvent} es la representación de
1352 @code{someNote}.  Sencillo.  ¿Y si ponemos el c' dentro de un
1353 acorde?
1354
1355 @example
1356 someNote = <c'>
1357 \displayMusic \someNote
1358 ===>
1359 (make-music
1360   'EventChord
1361   'elements
1362   (list (make-music
1363           'NoteEvent
1364           'duration
1365           (ly:make-duration 2 0 1/1)
1366           'pitch
1367           (ly:make-pitch 0 0 0))))
1368 @end example
1369
1370 Ahora el objeto @code{NoteEvent} es el primer objeto de la
1371 propiedad @code{'elements} de @code{someNote}.
1372
1373 La función @code{display-scheme-music} es la función que se usa
1374 por parte de @code{\displayMusic} para imprimir la representación
1375 de Scheme de una expresión musical.
1376
1377 @example
1378 #(display-scheme-music (first (ly:music-property someNote 'elements)))
1379 ===>
1380 (make-music
1381   'NoteEvent
1382   'duration
1383   (ly:make-duration 2 0 1/1)
1384   'pitch
1385   (ly:make-pitch 0 0 0))
1386 @end example
1387
1388 Después se accede a la altura de la nota a través de la propiedad
1389 @code{'pitch} del objeto @code{NoteEvent}:
1390
1391 @example
1392 #(display-scheme-music
1393    (ly:music-property (first (ly:music-property someNote 'elements))
1394                       'pitch))
1395 ===>
1396 (ly:make-pitch 0 0 0)
1397 @end example
1398
1399 La altura de la nota se puede cambiar estableciendo el valor de
1400 esta propiedad @code{'pitch}.
1401
1402 @funindex \displayLilyMusic
1403
1404 @example
1405 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
1406                           'pitch)
1407        (ly:make-pitch 0 1 0)) ;; establecer la altura a d'.
1408 \displayLilyMusic \someNote
1409 ===>
1410 d'4
1411 @end example
1412
1413
1414 @node Duplicar una nota con ligaduras (ejemplo)
1415 @subsection Duplicar una nota con ligaduras (ejemplo)
1416 @translationof Doubling a note with slurs (example)
1417
1418 Supongamos que queremos crear una función que convierte una
1419 entrada como @code{a} en @code{@{ a( a) @}}.  Comenzamos
1420 examinando la representación interna de la música con la que
1421 queremos terminar.
1422
1423 @example
1424 \displayMusic@{ a'( a') @}
1425 ===>
1426 (make-music
1427   'SequentialMusic
1428   'elements
1429   (list (make-music
1430           'NoteEvent
1431           'articulations
1432           (list (make-music
1433                   'SlurEvent
1434                   'span-direction
1435                   -1))
1436           'duration
1437           (ly:make-duration 2 0 1/1)
1438           'pitch
1439           (ly:make-pitch 0 5 0))
1440         (make-music
1441           'NoteEvent
1442           'articulations
1443           (list (make-music
1444                   'SlurEvent
1445                   'span-direction
1446                   1))
1447           'duration
1448           (ly:make-duration 2 0 1/1)
1449           'pitch
1450           (ly:make-pitch 0 5 0))))
1451 @end example
1452
1453 La mala noticia es que las expresiones @code{SlurEvent} se deben
1454 añadir @q{dentro} de la nota (dentro de la propiedad
1455 @code{articulations}).
1456
1457 Ahora examinamos la entrada.
1458
1459 @example
1460 \displayMusic a'
1461 ===>
1462 (make-music
1463   'NoteEvent
1464   'duration
1465   (ly:make-duration 2 0 1/1)
1466   'pitch
1467   (ly:make-pitch 0 5 0))))
1468 @end example
1469
1470 Así pues, en nuestra función, tenemos que clonar esta expresión
1471 (de forma que tengamos dos notas para construir la secuencia),
1472 añadir @code{SlurEvent} a la propiedad @code{'articulations} de
1473 cada una de ellas, y por último hacer una secuencia
1474 @code{SequentialMusic} con los dos elementos @code{NoteEvent}.
1475 Para añadir a una propiedad, es útil saber que una propiedad no
1476 establecida se lee como @code{'()}, la lista vacía, así que no se
1477 requiere ninguna comprobación especial antes de que pongamos otro
1478 elemento delante de la propiedad @code{articulations}.
1479
1480
1481 @example
1482 doubleSlur = #(define-music-function (note) (ly:music?)
1483          "Return: @{ note ( note ) @}.
1484          `note' is supposed to be a single note."
1485          (let ((note2 (ly:music-deep-copy note)))
1486            (set! (ly:music-property note 'articulations)
1487                  (cons (make-music 'SlurEvent 'span-direction -1)
1488                        (ly:music-property note 'articulations)))
1489            (set! (ly:music-property note2 'articulations)
1490                  (cons (make-music 'SlurEvent 'span-direction 1)
1491                        (ly:music-property note2 'articulations)))
1492            (make-music 'SequentialMusic 'elements (list note note2))))
1493 @end example
1494
1495
1496 @node Añadir articulaciones a las notas (ejemplo)
1497 @subsection Añadir articulaciones a las notas (ejemplo)
1498 @translationof Adding articulation to notes (example)
1499
1500 La manera fácil de añadir articulación a las notas es mezclar dos
1501 expresiones musicales en un solo contexto.  Sin embargo,
1502 supongamos que queremos escribir una función musical que lo haga.
1503 Esto tiene la ventaja adicional de que podemos usar esa función
1504 musical para añadir una articulación (como una instrucción de
1505 digitación) a una nota única dentro de un acorde, lo cual no es
1506 posible si nos limitamos a mezclar fragmentos de música
1507 independientes.
1508
1509 Una @code{$variable} dentro de la notación @code{#@{@dots{}#@}} es
1510 como una @code{\variable} normal en la notación clásica de
1511 LilyPond.  Sabemos que
1512
1513 @example
1514 @{ \music -. -> @}
1515 @end example
1516
1517 @noindent
1518 no funciona en LilyPond.  Podríamos evitar este problema
1519 adjuntando la articulación a un acorde vacío,
1520
1521 @example
1522 @{ << \music <> -. -> >> @}
1523 @end example
1524
1525 @noindent
1526 pero a los efectos de este ejemplo, aprenderemos ahora cómo
1527 hacerlo en Scheme.  Empezamos examinando nuestra entrada y la
1528 salida deseada.
1529
1530 @example
1531 %  input
1532 \displayMusic c4
1533 ===>
1534 (make-music
1535   'NoteEvent
1536   'duration
1537   (ly:make-duration 2 0 1/1)
1538   'pitch
1539   (ly:make-pitch -1 0 0))))
1540 =====
1541 %  desired output
1542 \displayMusic c4->
1543 ===>
1544 (make-music
1545   'NoteEvent
1546   'articulations
1547   (list (make-music
1548           'ArticulationEvent
1549           'articulation-type
1550           "accent"))
1551   'duration
1552   (ly:make-duration 2 0 1/1)
1553   'pitch
1554   (ly:make-pitch -1 0 0))
1555 @end example
1556
1557 Vemos que una nota (@code{c4}) se representa como una expresión
1558 @code{NoteEvent}.  Para añadir una articulación de acento, se debe
1559 añadir una expresión @code{ArticulationEvent} a la propiedad
1560 @code{articulations} de la expresión @code{NoteEvent}.
1561
1562 Para construir esta función, empezamos con
1563
1564 @example
1565 (define (add-accent note-event)
1566   "Add an accent ArticulationEvent to the articulations of `note-event',
1567   which is supposed to be a NoteEvent expression."
1568   (set! (ly:music-property note-event 'articulations)
1569         (cons (make-music 'ArticulationEvent
1570                 'articulation-type "accent")
1571               (ly:music-property note-event 'articulations)))
1572   note-event)
1573 @end example
1574
1575 La primera línea es la forma de definir una función en Scheme: el
1576 nombre de la función es @code{add-accent}, y tiene una variable
1577 llamada @code{note-event}.  En Scheme, el tipo de variable suele
1578 quedar claro a partir de su nombre (¡esto también es una buena
1579 práctica en otros lenguajes de programación!)
1580
1581 @example
1582 "Add an accent@dots{}"
1583 @end example
1584
1585 @noindent
1586 es una descripción de lo que hace la función.  No es estrictamente
1587 necesaria, pero de igual forma que los nombres claros de variable,
1588 es una buena práctica.
1589
1590 Se preguntará por qué modificamos el evento de nota directamente
1591 en lugar de trabajar sobre una copia (se puede usar
1592 @code{ly:music-deep-copy} para ello).  La razón es un contrato
1593 silencioso: se permite que las funciones musicales modifiquen sus
1594 argumentos; o bien se generan partiendo de cero (como la entrada
1595 del usuario) o están ya copiadas (referenciar una variable de
1596 música con @samp{\name} o la música procedente de expresiones de
1597 Scheme inmediatas @samp{$(@dots{})} proporcionan una copia).  Dado
1598 que sería ineficiente crear copias innecesarias, el valor devuelto
1599 de una función musical @emph{no} se copia.  Así pues, para cumplir
1600 dicho contrato, no debemos usar ningún argumento más de una vez, y
1601 devolverlo cuenta como una vez.
1602
1603 En un ejemplo anterior, hemos construido música mediante la
1604 repetición de un argumento musical dado.  En tal caso, al menos
1605 una repetidión tuvo que ser una copia de sí misma.  Si no lo
1606 fuese, podrían ocurrir cosas muy extrañas.  Por ejemplo, si usamos
1607 @code{\relative} o @code{\transpose} sobre la música resultante
1608 que contiene los mismos elementos varias veces, estarían sujetos
1609 varias veces a la relativización o al transporte.  Si los
1610 asignamos a una variable de música, se rompe el curso porque hacer
1611 referencia a @samp{\name} creará de nuevo una copia que no retiene
1612 la identidad de los elementos repetidos.
1613
1614 Ahora bien, aun cuando la función anterior no es una función
1615 musical, se usará normalmente dentro de funciones musicales.  Así
1616 pues, tiene sentido obedecer el mismo convenio que usamos para las
1617 funciones musicales: la entrada puede modificarse para producir la
1618 salida, y el código que llama es responsable de crear las copias
1619 si aún necesita el propio argumento sin modificar.  Si observamos
1620 las propias funciones de LilyPond como @code{music-map}, veremos
1621 que se atienen a los mismos principios.
1622
1623 ¿En qué punto nos encontramos?  Ahora tenemos un @code{note-event}
1624 que podemos modificar, no a causa de la utilización de
1625 @code{ly:music-deep-copy} sino por una explicación muy
1626 desarrollada.  Añadimos el acento a su propiedad de lista
1627 @code{'articulations}.
1628
1629 @example
1630 (set! place new-value)
1631 @end example
1632
1633 Aquí, lo que queremos establecer (el @q{place}) es la propiedad
1634 @code{'articulations} de la expresión @code{note-event}.
1635
1636 @example
1637 (ly:music-property note-event 'articulations)
1638 @end example
1639
1640 @code{ly:music-property} es la función ustilizada para acceder a las
1641 propiedades musicales (las @code{'articulations}, @code{'duration},
1642 @code{'pitch}, etc, que vemos arriba en la salida de
1643 @code{\displayMusic}).  El nuevo valor es la antigua propiedad
1644 @code{'articulations}, con un elemento adicional: la expresión
1645 @code{ArticulationEvent}, que copiamos a partir de la salida de
1646 @code{\displayMusic},
1647
1648 @example
1649 (cons (make-music 'ArticulationEvent
1650         'articulation-type "accent")
1651       (ly:music-property result-event-chord 'articulations))
1652 @end example
1653
1654 Se usa @code{cons} para añadir un elemento a la parte delantera de
1655 una lista sin modificar la lista original.  Esto es lo que
1656 queremos: la misma lista de antes, más la nueva expresión
1657 @code{ArticulationEvent}.  El orden dentro de la propiedad
1658 @code{'articulations} no tiene importancia aquí.
1659
1660 Finalmente, una vez hemos añadido la articulación de acento a su
1661 propiedad @code{articulations}, podemos devolver
1662 @code{note-event}, de aquí la última línea de la función.
1663
1664 Ahora transformamos la función @code{add-accent} en una función
1665 musical (es cuestión de un poco de aderezo sintáctico y una
1666 declaración del tipo de su único argumento @q{real}).
1667
1668 @example
1669 addAccent = #(define-music-function (note-event)
1670                                      (ly:music?)
1671   "Add an accent ArticulationEvent to the articulations of `note-event',
1672   which is supposed to be a NoteEvent expression."
1673   (set! (ly:music-property note-event 'articulations)
1674         (cons (make-music 'ArticulationEvent
1675                 'articulation-type "accent")
1676               (ly:music-property note-event 'articulations)))
1677   note-event)
1678 @end example
1679
1680 Podemos verificar que esta función musical funciona correctamente:
1681
1682 @example
1683 \displayMusic \addAccent c4
1684 @end example
1685
1686
1687 @ignore
1688 @menu
1689 * Trucos con Scheme::
1690 @end menu
1691
1692 @c @nod e Trucos con Scheme
1693 @c @sectio n Trucos con Scheme
1694 @c @transl ationof Tweaking with Scheme
1695
1696 Hemos visto cómo la salida de LilyPond se puede modificar
1697 profundamente usando instrucciones como
1698 @code{\override TextScript.extra-offset = ( 1 . -1)}.
1699 Pero tenemos incluso mucho más poder si
1700 utilizamos Scheme.  Para ver una explicación completa de esto,
1701 consulte el @ref{Tutorial de Scheme}, y @ruser{Interfaces para programadores}.
1702
1703 Podemos usar Scheme simplemente para sobreescribir instrucciones con
1704 @code{\override},
1705
1706 TODO Find a simple example
1707 @c This isn't a valid example with skylining
1708 @c It works fine without padText  -td
1709 @end ignore
1710
1711 @ignore
1712 @lilypond[quote,verbatim,ragged-right]
1713 padText = #(define-music-function (padding) (number?)
1714 #{
1715   \once \override TextScript.padding = #padding
1716 #})
1717
1718 \relative {
1719   c'''4^"piu mosso" b a b
1720   \padText #1.8
1721   c4^"piu mosso" d e f
1722   \padText #2.6
1723   c4^"piu mosso" fis a g
1724 }
1725 @end lilypond
1726 @end ignore
1727
1728 @ignore
1729 Lo podemos usar para crear instrucciones nuevas:
1730
1731 @c Check this is a valid example with skylining
1732 @c It is - 'padding still works
1733
1734
1735 @lilypond[quote,verbatim,ragged-right]
1736 tempoPadded = #(define-music-function (padding tempotext)
1737   (number? markup?)
1738 #{
1739   \once \override Score.MetronomeMark.padding = #padding
1740   \tempo \markup { \bold #tempotext }
1741 #})
1742
1743 \relative {
1744   \tempo \markup { "Low tempo" }
1745   c''4 d e f g1
1746   \tempoPadded #4.0 "High tempo"
1747   g4 f e d c1
1748 }
1749 @end lilypond
1750
1751
1752 Incluso se le pueden pasar expresiones musicales:
1753
1754 @lilypond[quote,verbatim,ragged-right]
1755 pattern = #(define-music-function (x y) (ly:music? ly:music?)
1756 #{
1757   #x e8 a b #y b a e
1758 #})
1759
1760 \relative c''{
1761   \pattern c8 c8\f
1762   \pattern {d16 dis} { ais16-> b\p }
1763 }
1764 @end lilypond
1765 @end ignore