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