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