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