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