]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/es/extending/scheme-tutorial.itely
Issue 5167/2: Let `make-markup' fetch the signature itself
[lilypond.git] / Documentation / es / extending / scheme-tutorial.itely
index 3966da7f944bcfdeadcb5407c95952d2d9625eef..5905f3e8d9364ee66c18630f4c586971f9ac036b 100644 (file)
@@ -1,20 +1,19 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
 
 @ignore
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
 
 @ignore
-    Translation of GIT committish: 3312aad46463fdae183931f24a8fafb743c72cd1
+    Translation of GIT committish: 3025442087de8dd3f88736290887ced86e360c25
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  For details, see the Contributors'
     Guide, node Updating translation committishes..
 @end ignore
 
 
     When revising a translation, copy the HEAD committish of the
     version that you are working on.  For details, see the Contributors'
     Guide, node Updating translation committishes..
 @end ignore
 
-@c \version "2.12.0"
+@c \version "2.19.22"
 
 @node Tutorial de Scheme
 @appendix Tutorial de Scheme
 @translationof Scheme tutorial
 
 
 @node Tutorial de Scheme
 @appendix Tutorial de Scheme
 @translationof Scheme tutorial
 
-@funindex #
 @cindex Scheme
 @cindex GUILE
 @cindex Scheme, código en línea
 @cindex Scheme
 @cindex GUILE
 @cindex Scheme, código en línea
 @cindex evaluar Scheme
 @cindex LISP
 
 @cindex evaluar Scheme
 @cindex LISP
 
-LilyPond utiliza el lenguaje de programación Scheme, tanto como parte
-de la sintaxis del código de entrada, como para servir de mecanismo
-interno que une los módulos del programa entre sí.  Esta sección es
-una panorámica muy breve sobre cómo introducir datos en Scheme.  Si
-quiere saber más sobre Scheme, consulte
+LilyPond utiliza el lenguaje de programación Scheme, tanto como
+parte de la sintaxis del código de entrada, como para servir de
+mecanismo interno que une los módulos del programa entre sí.  Esta
+sección es una panorámica muy breve sobre cómo introducir datos en
+Scheme.  Si quiere saber más sobre Scheme, consulte
 @uref{http://@/www@/.schemers@/.org}.
 
 LilyPond utiliza la implementación GNU Guile de Scheme, que está
 basada en el estándar @qq{R5RS} del lenguaje.  Si está aprendiendo
 Scheme para usarlo con LilyPond, no se recomienda trabajar con una
 @uref{http://@/www@/.schemers@/.org}.
 
 LilyPond utiliza la implementación GNU Guile de Scheme, que está
 basada en el estándar @qq{R5RS} del lenguaje.  Si está aprendiendo
 Scheme para usarlo con LilyPond, no se recomienda trabajar con una
-implementación distinta (o que se refiera a un estándar diferente).
-Hay información sobre Guile en
+implementación distinta (o que se refiera a un estándar
+diferente).  Hay información sobre Guile en
 @uref{http://www.gnu.org/software/guile/}.  El estándar de Scheme
 @qq{R5RS} se encuentra en
 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
 @uref{http://www.gnu.org/software/guile/}.  El estándar de Scheme
 @qq{R5RS} se encuentra en
 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
@@ -49,10 +48,10 @@ Hay información sobre Guile en
 @translationof Introduction to Scheme
 
 Comenzaremos con una introducción a Scheme.  Para esta breve
 @translationof Introduction to Scheme
 
 Comenzaremos con una introducción a Scheme.  Para esta breve
-introducción utilizaremos el intérprete GUILE para explorar la manera
-en que el lenguaje funciona.  Una vez nos hayamos familiarizado con
-Scheme, mostraremos cómo se puede integrar el lenguaje en los archivos
-de LilyPond.
+introducción utilizaremos el intérprete GUILE para explorar la
+manera en que el lenguaje funciona.  Una vez nos hayamos
+familiarizado con Scheme, mostraremos cómo se puede integrar el
+lenguaje en los archivos de LilyPond.
 
 
 @menu
 
 
 @menu
@@ -70,32 +69,46 @@ de LilyPond.
 @translationof Scheme sandbox
 
 La instalación de LilyPond incluye también la de la implementación
 @translationof Scheme sandbox
 
 La instalación de LilyPond incluye también la de la implementación
-Guile de Scheme.  Sobre casi todos los sistemas puede experimentar en
-una @qq{caja de arena} de Scheme abriendo una ventana del terminal y
-tecleando @q{guile}.  En algunos sistemas, sobre todo en Windows,
-podría necesitar ajustar la variable de entorno @code{GUILE_LOAD_PATH}
-a la carpeta @code{../usr/shr/guile/1.8} dentro de la instalación de
-LilyPond (para conocer la ruta completa a esta carpeta, consulte
-@rlearning{Otras fuentes de información}).  Como alternativa, los
-usuarios de Windows pueden seleccionar simplemente @q{Ejecutar} del
-menú Inicio e introducir @q{guile}.
-
-Una vez está funcionando el cajón de arena de Guile, verá un indicador
-del sistema de Guile:
+Guile de Scheme.  Sobre casi todos los sistemas puede experimentar
+en una @qq{caja de arena} de Scheme abriendo una ventana del
+terminal y tecleando @q{guile}.  En algunos sistemas, sobre todo
+en Windows, podría necesitar ajustar la variable de entorno
+@code{GUILE_LOAD_PATH} a la carpeta @code{../usr/share/guile/1.8}
+dentro de la instalación de LilyPond (para conocer la ruta
+completa a esta carpeta, consulte @rlearning{Otras fuentes de
+información}).  Como alternativa, los usuarios de Windows pueden
+seleccionar simplemente @q{Ejecutar} del menú Inicio e introducir
+@q{guile}.
+
+Sin embargo, está disponible un cajón de arena de Scheme listo
+para funcionar con todo LilyPond cargado, con esta instrucción de
+la línea de órdenes:
+@example
+lilypond scheme-sandbox
+@end example
+
+@noindent
+Una vez está funcionando el cajón de arena, verá un indicador del
+sistema de Guile:
 
 @lisp
 guile>
 @end lisp
 
 Podemos introducir expresiones de Scheme en este indicador para
 
 @lisp
 guile>
 @end lisp
 
 Podemos introducir expresiones de Scheme en este indicador para
-experimentar con Scheme.
+experimentar con Scheme.  Si quiere usar la biblioteca readline de
+GNU para una más cómoda edición de la línea de órdenes de Scheme,
+consulte el archivo @file{ly/scheme-sandbox.ly} para más
+información.  Si ya ha activado la biblioteca readline para las
+sesiones de Guile interactivas fuera de LilyPond, debería
+funcionar también en el cajón de arena.
 
 @node Variables de Scheme
 @subsection Variables de Scheme
 @translationof Scheme variables
 
 
 @node Variables de Scheme
 @subsection Variables de Scheme
 @translationof Scheme variables
 
-Las variables de Scheme pueden tener cualquier valor válido de Scheme,
-incluso un procedimiento de Scheme.
+Las variables de Scheme pueden tener cualquier valor válido de
+Scheme, incluso un procedimiento de Scheme.
 
 Las variables de Scheme se crean con @code{define}:
 
 
 Las variables de Scheme se crean con @code{define}:
 
@@ -104,8 +117,8 @@ guile> (define a 2)
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Las variables de Scheme se pueden evaluar en el indicador del sistema
-de guile, simplemente tecleando el nombre de la variable:
+Las variables de Scheme se pueden evaluar en el indicador del
+sistema de guile, simplemente tecleando el nombre de la variable:
 
 @lisp
 guile> a
 
 @lisp
 guile> a
@@ -113,8 +126,8 @@ guile> a
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Las variables de Scheme se pueden imprimir en la pantalla utilizando
-la función display:
+Las variables de Scheme se pueden imprimir en la pantalla
+utilizando la función display:
 
 @lisp
 guile> (display a)
 
 @lisp
 guile> (display a)
@@ -122,9 +135,10 @@ guile> (display a)
 @end lisp
 
 @noindent
 @end lisp
 
 @noindent
-Observe que el valor @code{2} y el indicador del sistema @code{guile}
-se muestran en la misma línea.  Esto se puede evitar llamando al
-procedimiento de nueva línea o imprimiendo un carácter de nueva línea.
+Observe que el valor @code{2} y el indicador del sistema
+@code{guile} se muestran en la misma línea.  Esto se puede evitar
+llamando al procedimiento de nueva línea o imprimiendo un carácter
+de nueva línea.
 
 @lisp
 guile> (display a)(newline)
 
 @lisp
 guile> (display a)(newline)
@@ -134,8 +148,8 @@ guile> (display a)(display "\n")
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Una vez que se ha creado una variable, su valor se puede modificar con
-@code{set!}:
+Una vez que se ha creado una variable, su valor se puede modificar
+con @code{set!}:
 
 @lisp
 guile> (set! a 12345)
 
 @lisp
 guile> (set! a 12345)
@@ -148,9 +162,10 @@ guile>
 @subsection Tipos de datos simples de Scheme
 @translationof Scheme simple data types
 
 @subsection Tipos de datos simples de Scheme
 @translationof Scheme simple data types
 
-El concepto más básico de un lenguaje son sus tipos de datos: números,
-cadenas de caracteres, listas, etc.  He aquí una lista de los tipos de
-datos que son de relevancia respecto de la entrada de LilyPond.
+El concepto más básico de un lenguaje son sus tipos de datos:
+números, cadenas de caracteres, listas, etc.  He aquí una lista de
+los tipos de datos que son de relevancia respecto de la entrada de
+LilyPond.
 
 @table @asis
 @item Booleanos
 
 @table @asis
 @item Booleanos
@@ -161,8 +176,8 @@ Los valores Booleanos son Verdadero y Falso.  Verdadero en Scheme es
 
 @item Números
 Los números se escriben de la forma normal, @code{1} es el número
 
 @item Números
 Los números se escriben de la forma normal, @code{1} es el número
-(entero) uno, mientras que @code{-1.5} es un número en coma flotante
-(un número no entero).
+(entero) uno, mientras que @w{@code{-1.5}} es un número en coma
+flotante (un número no entero).
 
 @item Cadenas
 Las cadenas se encierran entre comillas:
 
 @item Cadenas
 Las cadenas se encierran entre comillas:
@@ -180,8 +195,8 @@ una cadena"
 @end example
 
 @noindent
 @end example
 
 @noindent
-y los caracteres de nueva línea al final de cada línea se incluirán
-dentro de la cadena.
+y los caracteres de nueva línea al final de cada línea se
+incluirán dentro de la cadena.
 
 Los caracteres de nueva línea también se pueden añadir mediante la
 inclusión de @code{\n} en la cadena.
 
 Los caracteres de nueva línea también se pueden añadir mediante la
 inclusión de @code{\n} en la cadena.
@@ -192,8 +207,8 @@ inclusión de @code{\n} en la cadena.
 
 
 Las comillas dobles y barras invertidas se añaden a las cadenas
 
 
 Las comillas dobles y barras invertidas se añaden a las cadenas
-precediéndolas de una barra invertida.  La cadena @code{\a dijo "b"}
-se introduce como
+precediéndolas de una barra invertida.  La cadena @code{\a dijo
+"b"} se introduce como
 
 @example
 "\\a dijo \"b\""
 
 @example
 "\\a dijo \"b\""
@@ -201,24 +216,34 @@ se introduce como
 
 @end table
 
 
 @end table
 
-Existen más tipos de datos de Scheme que no se estudian aquí.  Para
-ver un listado completo, consulte la guía de referencia de Guile,
+Existen más tipos de datos de Scheme que no se estudian aquí.
+Para ver un listado completo, consulte la guía de referencia de
+Guile,
 @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}.
 
 @node Tipos de datos compuestos de Scheme
 @subsection Tipos de datos compuestos de Scheme
 @translationof Scheme compound data types
 
 @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}.
 
 @node Tipos de datos compuestos de Scheme
 @subsection Tipos de datos compuestos de Scheme
 @translationof Scheme compound data types
 
-También existen tipos de datos compuestos en Scheme.  Entre los tipos
-más usados en la programación de LilyPond se encuentran las parejas,
-las listas, las listas-A y las tablas de hash.
+También existen tipos de datos compuestos en Scheme.  Entre los
+tipos más usados en la programación de LilyPond se encuentran las
+parejas, las listas, las listas-A y las tablas de hash.
+
+@menu
+* Parejas::
+* Listas::
+* Listas asociativas (listas-A)::
+* Tablas de hash::
+@end menu
 
 
-@subheading Parejas
+@node Parejas
+@unnumberedsubsubsec Parejas
+@translationof Pairs
 
 
-El tipo fundacional de datos compuestos de Scheme es la @code{pareja}.
-Como se espera por su nombre, una pareja son dos valores unidos en uno
-solo.  El operador que se usa para formar una pareja se llama
-@code{cons}.
+El tipo fundacional de datos compuestos de Scheme es la
+@code{pareja}.  Como se espera por su nombre, una pareja son dos
+valores unidos en uno solo.  El operador que se usa para formar
+una pareja se llama @code{cons}.
 
 @lisp
 guile> (cons 4 5)
 
 @lisp
 guile> (cons 4 5)
@@ -240,8 +265,8 @@ guile> '(4 . 5)
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Los dos elementos de una pareja pueden ser cualquier valor válido de
-Scheme:
+Los dos elementos de una pareja pueden ser cualquier valor válido
+de Scheme:
 
 @lisp
 guile> (cons #t #f)
 
 @lisp
 guile> (cons #t #f)
@@ -251,12 +276,13 @@ guile> '("bla-bla" . 3.1415926535)
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Se puede accede al primero y segundo elementos de la pareja mediante
-los procedimientos de Scheme @code{car} y @code{cdr}, respectivamente.
+Se puede accede al primero y segundo elementos de la pareja
+mediante los procedimientos de Scheme @code{car} y @code{cdr},
+respectivamente.
 
 @lisp
 guile> (define mipareja (cons 123 "Hola")
 
 @lisp
 guile> (define mipareja (cons 123 "Hola")
-... )
+@dots{} )
 guile> (car mipareja)
 123
 guile> (cdr mipareja)
 guile> (car mipareja)
 123
 guile> (cdr mipareja)
@@ -270,49 +296,63 @@ Nota: @code{cdr} se pronuncia "could-er", según Sussman y Abelson,
 véase
 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
 
 véase
 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
 
+@node Listas
+@unnumberedsubsubsec Listas
+@translationof Lists
 
 
-@subheading Listas
-
-Una estructura de datos muy común en Scheme es la @emph{lista}.
-Formalmente, una lista se define como la lista vacía (representada
-como @code{'()}, o bien como una pareja cuyo @code{cdr} es una lista.
+Una estructura de datos muy común en Scheme es la
+@emph{lista}. Formalmente, una lista @q{bien hecha} se define como
+la lista vacía, representada como @code{'()} y con longitud cero,
+o bien como una pareja cuyo @code{cdr} es a su vez una lista más
+corta.
 
 
-Existen muchas formas de crear listas.  Quizá la más común es con el
-procedimiento @code{list}:
+Existen muchas formas de crear listas.  Quizá la más común es con
+el procedimiento @code{list}:
 
 @lisp
 guile> (list 1 2 3 "abc" 17.5)
 (1 2 3 "abc" 17.5)
 @end lisp
 
 
 @lisp
 guile> (list 1 2 3 "abc" 17.5)
 (1 2 3 "abc" 17.5)
 @end lisp
 
-Como se ve, una lista se imprime en la forma de elementos individuales
-separados por espacios y encerradas entre paréntesis.  A diferencia de
-las parejas, no hay ningún punto entre los elementos.
+La representación de una lista como elementos individuales
+separados por espacios y encerrada entre paréntesis es realmente
+una forma compacta de las parejas con punto que constituyen la
+lista, donde el punto e inmediatamente un paréntesis de apertura
+se suprimen junto al paréntesis de cierre correspondiente.  Sin
+esta compactación, la salida habría sido
+@lisp
+(1 . (2 . (3 . ("abc" . (17.5 . ())))))
+@end lisp
 
 
-También se puede escribir una lista como una lista literal encerrando
-sus elementos entre paréntesis y añadiendo un apóstrofo:
+De igual forma que con la salida, una lista puede escribirse
+(después de haber añadido un apóstrofo para evitar su
+interpretación como una llamada de función) como una lista literal
+encerrando sus elementos entre paréntesis:
 
 @lisp
 guile> '(17 23 "fulano" "mengano" "zutano")
 (17 23 "fulano" "mengano" "zutano")
 @end lisp
 
 
 @lisp
 guile> '(17 23 "fulano" "mengano" "zutano")
 (17 23 "fulano" "mengano" "zutano")
 @end lisp
 
-Las listas son una parte fundamental de Scheme.  De hecho, Scheme se
-considera un dialecto de Lisp, donde @q{lisp} es una abreviatura de
-@q{List Processing} (proceso de listas).  Todas las expresiones de
-Scheme son listas.
+Las listas son una parte fundamental de Scheme.  De hecho, Scheme
+se considera un dialecto de Lisp, donde @q{lisp} es una
+abreviatura de @q{List Processing} (proceso de listas).  Todas las
+expresiones de Scheme son listas.
 
 
-@subheading Listas asociativas (listas-A)
+
+@node Listas asociativas (listas-A)
+@unnumberedsubsubsec Listas asociativas (listas-A)
+@translationof Association lists (alists)
 
 Un tipo especial de listas son las @emph{listas asociativas} o
 
 Un tipo especial de listas son las @emph{listas asociativas} o
-@emph{listas-A}.  Se puede usar una lista-A para almacenar datos para
-su fácil recuperación posterior.
+@emph{listas-A}.  Se puede usar una lista-A para almacenar datos
+para su fácil recuperación posterior.
 
 
-Las listas-A son listas cuyos elementos son parejas.  El @code{car} de
-cada elemento se llama @emph{clave}, y el @code{cdr} de cada elemento
-se llama @emph{valor}.  El procedimiento de Scheme @code{assoc} se usa
-para recuperar un elemento de la lista-A, y @code{cdr} se usa para
-recuperar el valor:
+Las listas-A son listas cuyos elementos son parejas.  El
+@code{car} de cada elemento se llama @emph{clave}, y el @code{cdr}
+de cada elemento se llama @emph{valor}.  El procedimiento de
+Scheme @code{assoc} se usa para recuperar un elemento de la
+lista-A, y @code{cdr} se usa para recuperar el valor:
 
 @lisp
 guile> (define mi-lista-a '((1  . "A") (2 . "B") (3 . "C")))
 
 @lisp
 guile> (define mi-lista-a '((1  . "A") (2 . "B") (3 . "C")))
@@ -325,18 +365,22 @@ guile> (cdr (assoc 2 mi-lista-a))
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Las listas-A se usan mucho en LilyPond para almacenar propiedades y
-otros datos.
+Las listas-A se usan mucho en LilyPond para almacenar propiedades
+y otros datos.
+
 
 
-@subheading Tablas de hash
+@node Tablas de hash
+@unnumberedsubsubsec Tablas de hash
+@translationof Hash tables
 
 
-Estructuras de datos que se utilizan en LilyPond de forma ocasional.
-Una tabla de hash es similar a una matriz, pero los índices de la
-matriz pueden ser cualquier tipo de valor de Scheme, no sólo enteros.
+Estructuras de datos que se utilizan en LilyPond de forma
+ocasional.  Una tabla de hash es similar a una matriz, pero los
+índices de la matriz pueden ser cualquier tipo de valor de Scheme,
+no sólo enteros.
 
 
-Las tablas de hash son más eficientes que las listas-A si hay una gran
-cantidad de datos que almacenar y los datos cambian con muy poca
-frecuencia.
+Las tablas de hash son más eficientes que las listas-A si hay una
+gran cantidad de datos que almacenar y los datos cambian con muy
+poca frecuencia.
 
 La sintaxis para crear tablas de hash es un poco compleja, pero
 veremos ejemplos de ello en el código fuente de LilyPond.
 
 La sintaxis para crear tablas de hash es un poco compleja, pero
 veremos ejemplos de ello en el código fuente de LilyPond.
@@ -365,8 +409,8 @@ guile>
 @end lisp
 
 Las claves y los valores se recuperan como una pareja con
 @end lisp
 
 Las claves y los valores se recuperan como una pareja con
-@code{hashq-get-handle}.  Ésta es la forma preferida, porque devuelve
-@code{#f} si no se encuentra la clave.
+@code{hashq-get-handle}.  Ésta es la forma preferida, porque
+devuelve @code{#f} si no se encuentra la clave.
 
 @lisp
 guile> (hashq-get-handle h 'key1)
 
 @lisp
 guile> (hashq-get-handle h 'key1)
@@ -401,16 +445,16 @@ símbolos, una lista de símbolos y una lista de listas respectivamente:
 @end ignore
 
 Scheme se puede usar para hacer cálculos.  Utiliza sintaxis
 @end ignore
 
 Scheme se puede usar para hacer cálculos.  Utiliza sintaxis
-@emph{prefija}.  Sumar 1 y@tie{}2 se escribe como @code{(+ 1 2)} y no
-como el tradicional @math{1+2}.
+@emph{prefija}.  Sumar 1 y@tie{}2 se escribe como @code{(+ 1 2)} y
+no como el tradicional @math{1+2}.
 
 @lisp
 guile> (+ 1 2)
 3
 @end lisp
 
 
 @lisp
 guile> (+ 1 2)
 3
 @end lisp
 
-Los cálculos se pueden anidar; el resultado de una función se puede
-usar para otro cálculo.
+Los cálculos se pueden anidar; el resultado de una función se
+puede usar para otro cálculo.
 
 @lisp
 guile> (+ 1 (* 3 4))
 
 @lisp
 guile> (+ 1 (* 3 4))
@@ -420,9 +464,10 @@ guile> (+ 1 (* 3 4))
 Estos cálculos son ejemplos de evaluaciones; una expresión como
 @code{(* 3 4)} se sustituye por su valor @code{12}.
 
 Estos cálculos son ejemplos de evaluaciones; una expresión como
 @code{(* 3 4)} se sustituye por su valor @code{12}.
 
-Los cálculos de Scheme son sensibles a las diferencias entre enteros y
-no enteros.  Los cálculos enteros son exactos, mientras que los no
-enteros se calculan con los límites de precisión adecuados:
+Los cálculos de Scheme son sensibles a las diferencias entre
+enteros y no enteros.  Los cálculos enteros son exactos, mientras
+que los no enteros se calculan con los límites de precisión
+adecuados:
 
 @lisp
 guile> (/ 7 3)
 
 @lisp
 guile> (/ 7 3)
@@ -432,13 +477,13 @@ guile> (/ 7.0 3.0)
 @end lisp
 
 Cuando el intérprete de Scheme encuentra una expresión que es una
 @end lisp
 
 Cuando el intérprete de Scheme encuentra una expresión que es una
-lista, el primer elemento de la lista se trata como un procedimiento a
-evaluar con los argumentos del resto de la lista.  Por tanto, todos
-los operadores en Scheme son operadores prefijos.
+lista, el primer elemento de la lista se trata como un
+procedimiento a evaluar con los argumentos del resto de la lista.
+Por tanto, todos los operadores en Scheme son operadores prefijos.
 
 
-Si el primer elemento de una expresión de Scheme que es una lista que
-se pasa al intérprete @emph{no es} un operador o un procedimiento, se
-produce un error:
+Si el primer elemento de una expresión de Scheme que es una lista
+que se pasa al intérprete @emph{no es} un operador o un
+procedimiento, se produce un error:
 
 @lisp
 guile> (1 2 3)
 
 @lisp
 guile> (1 2 3)
@@ -453,13 +498,13 @@ ABORT: (misc-error)
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Aquí podemos ver que el intérprete estaba intentando tratar el 1 como
-un operador o procedimiento, y no pudo hacerlo.  De aquí que el error
-sea "Wrong type to apply: 1".
+Aquí podemos ver que el intérprete estaba intentando tratar el 1
+como un operador o procedimiento, y no pudo hacerlo.  De aquí que
+el error sea "Wrong type to apply: 1".
 
 
-Así pues, para crear una lista debemos usar el operador de lista, o
-podemos precederla de un apóstrofo para que el intérprete no trate de
-evaluarla.
+Así pues, para crear una lista debemos usar el operador de lista,
+o podemos precederla de un apóstrofo para que el intérprete no
+trate de evaluarla.
 
 @lisp
 guile> (list 1 2 3)
 
 @lisp
 guile> (list 1 2 3)
@@ -469,8 +514,8 @@ guile> '(1 2 3)
 guile>
 @end lisp
 
 guile>
 @end lisp
 
-Esto es un error que puede aparecer cuando trabaje con Scheme dentro
-de LilyPond.
+Esto es un error que puede aparecer cuando trabaje con Scheme
+dentro de LilyPond.
 
 @ignore
 La misma asignación se puede hacer también completamente en Scheme,
 
 @ignore
 La misma asignación se puede hacer también completamente en Scheme,
@@ -501,11 +546,19 @@ nombre @code{veintiCuatro}.
 @subsection Procedimientos de Scheme
 @translationof Scheme procedures
 
 @subsection Procedimientos de Scheme
 @translationof Scheme procedures
 
-Los procedimientos de Scheme son expresiones de Scheme ejecutables que
-devuelven un valor resultante de su ejecución.  También pueden
+Los procedimientos de Scheme son expresiones de Scheme ejecutables
+que devuelven un valor resultante de su ejecución.  También pueden
 manipular variables definidas fuera del procedimiento.
 
 manipular variables definidas fuera del procedimiento.
 
-@subheading Definir procedimientos
+@menu
+* Definir procedimientos::
+* Predicados::
+* Valores de retorno::
+@end menu
+
+@node Definir procedimientos
+@unnumberedsubsubsec Definir procedimientos
+@translationof Defining procedures
 
 Los procedimientos se definen en Scheme con @code{define}:
 
 
 Los procedimientos se definen en Scheme con @code{define}:
 
@@ -514,7 +567,8 @@ Los procedimientos se definen en Scheme con @code{define}:
  expresión-de-scheme-que-devuelve-un-valor)
 @end example
 
  expresión-de-scheme-que-devuelve-un-valor)
 @end example
 
-Por ejemplo, podemos definir un procedimiento para calcular la media:
+Por ejemplo, podemos definir un procedimiento para calcular la
+media:
 
 @lisp
 guile> (define (media x y) (/ (+ x y) 2))
 
 @lisp
 guile> (define (media x y) (/ (+ x y) 2))
@@ -522,20 +576,24 @@ guile> media
 #<procedure media (x y)>
 @end lisp
 
 #<procedure media (x y)>
 @end lisp
 
-Una vez se ha definido un procedimiento, se llama poniendo el nombre
-del procedimiento dentro de una lista.  Por ejemplo, podemos calcular
-la media de 3 y 12:
+Una vez se ha definido un procedimiento, se llama poniendo el
+nombre del procedimiento dentro de una lista.  Por ejemplo,
+podemos calcular la media de 3 y 12:
 
 @lisp
 guile> (media 3 12)
 15/2
 @end lisp
 
 
 @lisp
 guile> (media 3 12)
 15/2
 @end lisp
 
-@subheading Predicados
 
 
-Los procedimientos de Scheme que devuelven valores booleanos se suelen
-llamar @emph{predicados}.  Por convenio (pero no por necesidad),
-los nombres de predicados acaban en un signo de interrogación:
+@node Predicados
+@unnumberedsubsubsec Predicados
+@translationof Predicates
+
+Los procedimientos de Scheme que devuelven valores booleanos se
+suelen llamar @emph{predicados}.  Por convenio (pero no por
+necesidad), los nombres de predicados acaban en un signo de
+interrogación:
 
 @lisp
 guile> (define (menor-que-diez? x) (< x 10))
 
 @lisp
 guile> (define (menor-que-diez? x) (< x 10))
@@ -545,42 +603,54 @@ guile> (menor-que-diez? 15)
 #f
 @end lisp
 
 #f
 @end lisp
 
-@subheading Valores de retorno
 
 
-Los procedimientos de Scheme siempre devuelven un valor de retorno,
-que es el valor de la última expresión ejecutada en el procedimiento.
-El valor de retorno puede ser cualquier valor de Scheme válido,
-incluso una estructura de datos compleja o un procedimiento.
+@node Valores de retorno
+@unnumberedsubsubsec Valores de retorno
+@translationof Return values
+
+Los procedimientos de Scheme siempre devuelven un valor de
+retorno, que es el valor de la última expresión ejecutada en el
+procedimiento.  El valor de retorno puede ser cualquier valor de
+Scheme válido, incluso una estructura de datos compleja o un
+procedimiento.
 
 
-A veces, el usuario quiere tener varias expresiones de Scheme dentro
-de un procedimiento.  Existen dos formas en que se pueden combinar
-distintas expresiones.  La primera es el procedimiento @code{begin},
-que permite evaluar varias expresiones, y devuelve el valor de la
-última expresión.
+A veces, el usuario quiere tener varias expresiones de Scheme
+dentro de un procedimiento.  Existen dos formas en que se pueden
+combinar distintas expresiones.  La primera es el procedimiento
+@code{begin}, que permite evaluar varias expresiones, y devuelve
+el valor de la última expresión.
 
 @lisp
 guile> (begin (+ 1 2) (- 5 8) (* 2 2))
 4
 @end lisp
 
 
 @lisp
 guile> (begin (+ 1 2) (- 5 8) (* 2 2))
 4
 @end lisp
 
-La segunda forma de combinar varias expresiones es dentro de un bloque
-@code{let}.  Dentro de un bloque let, se crean una serie de ligaduras
-o asignaciones, y después se evalúa una secuencia de expresiones que
-pueden incluir esas ligaduras o asignaciones.  El valor de retorno del
-bloque let es el valor de retorno de la última sentencia del bloque
-let:
+La segunda forma de combinar varias expresiones es dentro de un
+bloque @code{let}.  Dentro de un bloque let, se crean una serie de
+ligaduras o asignaciones, y después se evalúa una secuencia de
+expresiones que pueden incluir esas ligaduras o asignaciones.  El
+valor de retorno del bloque let es el valor de retorno de la
+última sentencia del bloque let:
 
 @lisp
 guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
 
 @lisp
 guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
-... (+ (* x y) (/ z x)))
+@dots{} (+ (* x y) (/ z x)))
 508
 @end lisp
 
 508
 @end lisp
 
+
 @node Condicionales de Scheme
 @subsection Condicionales de Scheme
 @translationof Scheme conditionals
 
 @node Condicionales de Scheme
 @subsection Condicionales de Scheme
 @translationof Scheme conditionals
 
-@subheading if
+@menu
+* if::
+* cond::
+@end menu
+
+@node if
+@unnumberedsubsubsec if
+@translationof if
 
 Scheme tiene un procedimiento @code{if}:
 
 
 Scheme tiene un procedimiento @code{if}:
 
@@ -591,8 +661,8 @@ Scheme tiene un procedimiento @code{if}:
 @var{expresión-de-prueba} es una expresión que devuelve un valor
 booleano.  Si @var{expresión-de-prueba} devuelve @code{#t}, el
 procedimiento @code{if} devuelve el valor de la
 @var{expresión-de-prueba} es una expresión que devuelve un valor
 booleano.  Si @var{expresión-de-prueba} devuelve @code{#t}, el
 procedimiento @code{if} devuelve el valor de la
-@var{expresión-de-cierto}, en caso contrario devuelve el valor de la
-@var{expresión-de-falso}.
+@var{expresión-de-cierto}, en caso contrario devuelve el valor de
+la @var{expresión-de-falso}.
 
 @lisp
 guile> (define a 3)
 
 @lisp
 guile> (define a 3)
@@ -601,14 +671,17 @@ guile> (if (> a b) "a es mayor que b" "a no es mayor que b")
 "a no es mayor que b"
 @end lisp
 
 "a no es mayor que b"
 @end lisp
 
-@subheading cond
 
 
-Otro procedimiento condicional en scheme es @code{cond}:
+@node cond
+@unnumberedsubsubsec cond
+@translationof cond
+
+Otro procedimiento condicional en Scheme es @code{cond}:
 
 @example
 (cond (expresión-de-prueba-1 secuencia-de-expresiones-resultante-1)
       (expresión-de-prueba-2 secuencia-de-expresiones-resultante-2)
 
 @example
 (cond (expresión-de-prueba-1 secuencia-de-expresiones-resultante-1)
       (expresión-de-prueba-2 secuencia-de-expresiones-resultante-2)
-      ...
+      @dots{}
       (expresión-de-prueba-n secuencia-de-expresiones-resultante-n))
 @end example
 
       (expresión-de-prueba-n secuencia-de-expresiones-resultante-n))
 @end example
 
@@ -631,6 +704,7 @@ guile> (cond ((< a b) "a es menor que b")
 * Sintaxis del Scheme de LilyPond::
 * Variables de LilyPond::
 * Variables de entrada y Scheme::
 * Sintaxis del Scheme de LilyPond::
 * Variables de LilyPond::
 * Variables de entrada y Scheme::
+* Importación de Scheme dentro de LilyPond::
 * Propiedades de los objetos::
 * Variables de LilyPond compuestas::
 * Representación interna de la música::
 * Propiedades de los objetos::
 * Variables de LilyPond compuestas::
 * Representación interna de la música::
@@ -639,48 +713,115 @@ guile> (cond ((< a b) "a es menor que b")
 @node Sintaxis del Scheme de LilyPond
 @subsection Sintaxis del Scheme de LilyPond
 @translationof LilyPond Scheme syntax
 @node Sintaxis del Scheme de LilyPond
 @subsection Sintaxis del Scheme de LilyPond
 @translationof LilyPond Scheme syntax
+@funindex $
+@funindex #
 
 
-El intérprete Guile forma parte de LilyPond, lo que significa que se
-puede incluir Scheme dentro de los archivos de entrada de LilyPond.
-La marca de almohadilla @code{#} se utiliza para indicar al analizador
-sintáctico de LilyPond que lo siguiente es un valor de Scheme.
-
-Una vez el analizador sintáctico se encuentra con un símbolo de
-almohadilla, la entrada se le pasa al intérprete Guile para evaluar la
-expresión de Scheme.  El intérprete continúa procesando la entrada
-hasta que se encuentra con el final de una expresión de Scheme.
-
-Los procedimientos de Scheme se pueden definir dentro de los archivos
+El intérprete Guile forma parte de LilyPond, lo que significa que
+se puede incluir Scheme dentro de los archivos de entrada de
+LilyPond.  Existen varios métodos para incluir Scheme dentro de
+LilyPond.
+
+La manera más sencilla es utilizar el símbolo de
+almohadilla@tie{}@code{#} antes de una expresión de Scheme.
+
+Ahora bien, el código de entrada de LilyPond se estructura en
+elementos y expresiones, de forma parecida a cómo el lenguaje
+humano se estructura en palabras y frases.  LilyPond tiene un
+analizador léxico que reconoce elementos indivisibles (números
+literales, cadenas de texto, elementos de Scheme, nombres de nota,
+etc.), y un analizador que entiende la sintaxis, la Gramática de
+LilyPond (@rcontrib{LilyPond grammar}).  Una vez que sabe que se
+aplica una regla sintáctica concreta, ejecuta las acciones
+asociadas con ella.
+
+El método del símbolo de almohadilla@tie{}@code{#} para incrustar
+Scheme se adapta de forma natural a este sistema.  Una vez que el
+analizador léxico ve un símbolo de almohadilla, llama al lector de
+Scheme para que lea una expresión de Scheme completa (que puede
+ser un identificador, una expresión encerrada entre paréntesis, o
+algunas otras cosas).  Después de que se ha leído la expresión de
+Scheme, se almacena como el valor de un elemento @code{SCM_TOKEN}
+de la gramática.  Después de que el analizador sintáctico ya sabe
+cómo hacer uso de este elemento, llama a Guila para que evalúe la
+expresión de Scheme.  Dado que el analizador sintáctico suele
+requerir un poco de lectura por delante por parte del analizador
+léxico para tomar sus decisiones de análisis sintáctico, esta
+separación de lectura y evaluación entre los analizadores léxico y
+sintáctico es justamente lo que se necesita para mantener
+sincronizadas las ejecuciones de expresiones de LilyPond y de
+Scheme.  Por este motivo se debe usar el símbolo de
+almohadilla@tie{}@code{#} para llamar a Scheme siempre que sea
+posible.
+
+Otra forma de llamar al intérprete de Scheme desde LilyPond es el
+uso del símbolo de dólar@tie{}@code{$} en lugar de la almohadilla
+para introducir las expresiondes de Scheme.  En este caso,
+LilyPond evalúa el código justo después de que el analizador
+léxico lo ha leído.  Comprueba el tipo resultante de la expresión
+de Scheme y después selecciona un tipo de elemento (uno de los
+varios elementos @code{xxx_IDENTIFIER} dentro de la sintaxis) para
+él.  Crea una @emph{copia} del valor y la usa como valor del
+elemento.  Si el valor de la expresión es vacío (El valor de Guile
+de @code{*unspecified*}), no se pasa nada en absoluto al
+analizador sintáctico.
+
+Éste es, de hecho, el mismo mecanismo exactamente que LilyPond
+emplea cuando llamamos a cualquier variable o función musical por
+su nombre, como @code{\nombre}, con la única diferencia de que el
+nombre viene determinado por el analizador léxico de LilyPond sin
+consultar al lector de Scheme, y así solamente se aceptan los
+nombres de variable consistentes con el modo actual de LilyPond.
+
+La acción inmediata de @code{$} puede llevar a alguna que otra
+sorpresa, véase @ref{Importación de Scheme dentro de LilyPond}.
+La utilización de @code{#} donde el analizador sintáctico lo
+contempla es normalmente preferible.  Dentro de las expresiones
+musicales, aquellas que se crean utilizando @code{#} @emph{se
+interprentan} como música.  Sin embargo, @emph{no se copian} antes
+de ser utilizadas.  Si forman parte de alguna estructura que aún
+podría tener algún uso, quizá tenga que utilizar explícitamente
+@code{ly:music-deep-copy}.
+
+@funindex $@@
+@funindex #@@
+También existen los operadores de @q{división de listas}
+@code{$@@} y @code{#@@} que insertan todos los elementos de una
+lista dentro del contexto circundante.
+
+Ahora echemos un vistazo a algo de código de Scheme real.  Los
+procedimientos de Scheme se pueden definir dentro de los archivos
 de entrada de LilyPond:
 
 @example
 de entrada de LilyPond:
 
 @example
-#(define (average a b c) (/ (+ a b c) 3))
+#(define (media a b c) (/ (+ a b c) 3))
 @end example
 
 @end example
 
-Observe que los comentarios de LilyPond (@code{%} y @code{%@{ %@}}) no
-se pueden utilizar dentro del código de Scheme, ni siquiera dentro de
-un archivo de entrada de LilyPond input file, porque es el intérprete
-Guile, y no el analizador sintáctico de LilyPond, el que está
-interpretando la expresión de Scheme.  Los comentarios en el Scheme de
-Guile se introducen como sigue:
+Observe que los comentarios de LilyPond (@code{%} y @code{%@{
+%@}}) no se pueden utilizar dentro del código de Scheme, ni
+siquiera dentro de un archivo de entrada de LilyPond, porque es el
+intérprete Guile, y no el analizador léxico de LilyPond, el que
+está leyendo la expresión de Scheme.  Los comentarios en el Scheme
+de Guile se introducen como sigue:
 
 @example
 ; esto es un comentario de una línea
 
 #!
   Esto es un comentario de bloque (no anidable) estilo Guile
 
 @example
 ; esto es un comentario de una línea
 
 #!
   Esto es un comentario de bloque (no anidable) estilo Guile
-  Pero se usan rara vez por parte de los Schemers y nunca dentro del
-  código fuente de LilyPond
+  Pero se usan rara vez por parte de los Schemers
+  y nunca dentro del código fuente de LilyPond
 !#
 @end example
 
 Durante el resto de esta sección, supondremos que los datos se
 !#
 @end example
 
 Durante el resto de esta sección, supondremos que los datos se
-introducen en un archivo de música, por lo que añadiremos almohadillas
-@code{#} al principio de todas las expresiones de Scheme.
+introducen en un archivo de música, por lo que añadiremos una
+almohadilla@tie{}@code{#} al principio de cada una de las
+expresiones de Scheme.
 
 
-Todas las expresiones de Scheme del nivel jerárquico superior dentro
-de un archivo de entrada de LilyPond se pueden combinar en una sola
-expresión de Scheme mediante la utilización del operador @code{begin}:
+Todas las expresiones de Scheme del nivel jerárquico superior
+dentro de un archivo de entrada de LilyPond se pueden combinar en
+una sola expresión de Scheme mediante la utilización del operador
+@code{begin}:
 
 @example
 #(begin
 
 @example
 #(begin
@@ -707,24 +848,47 @@ equivale a
 #(define doce 12)
 @end example
 
 #(define doce 12)
 @end example
 
-Esto significa que las variables de LilyPond están disponibles para su
-uso dentro de expresiones de Scheme.  Por ejemplo, podríamos usar
+Esto significa que las variables de LilyPond están disponibles
+para su uso dentro de expresiones de Scheme.  Por ejemplo,
+podríamos usar
 
 @example
 veintiCuatro = (* 2 doce)
 @end example
 
 @noindent
 
 @example
 veintiCuatro = (* 2 doce)
 @end example
 
 @noindent
-lo que daría lugar a que el número 24 se almacenase dentro de la
-variable @code{veintiCuatro} de LilyPond (y de Scheme).
+lo que daría lugar a que el número @emph{24} se almacenase dentro
+de la variable @code{veintiCuatro} de LilyPond (y de Scheme).
+
+El lenguaje Scheme permite la modificación de expresiones
+complejas in situ y LilyPond hace uso de esta @q{modificación in
+situ} al usar funciones musicales.  Pero cuando las expresiones
+musicales se almacenan dentro de variables en lugar de ser
+introducidas directamente, lo que habitualmente se espera cuando
+se pasan a funciones musicales sería que el valor original quedase
+intacto.  Así pues, cuando se referencia una variable musical con
+la barra invertida (como @code{\veintiCuatro}), LilyPond crea una
+copia del valor musical de tal variable para utilizarla dentro de
+la expresión musical circundante, en lugar de usar el valor de la
+variable directamente.
+
+Por ello, las expresiones musicales de Scheme escritas con la
+sintasis de almohadilla @code{#} deberían utilizarse para
+cualquier material creado @q{partiendo de cero} (o que se ha
+copiado explícitamente) en lugar de utilizarse para referenciar
+música directamente.
+
+@seealso
+Manual de extensión:
+@ref{Sintaxis del Scheme de LilyPond}.
 
 @node Variables de entrada y Scheme
 @subsection Variables de entrada y Scheme
 @translationof Input variables and Scheme
 
 El formato de entrada contempla la noción de variables: en el
 
 @node Variables de entrada y Scheme
 @subsection Variables de entrada y Scheme
 @translationof Input variables and Scheme
 
 El formato de entrada contempla la noción de variables: en el
-siguiente ejemplo, se asigna una expresión musical a una variable con
-el nombre @code{traLaLa}.
+siguiente ejemplo, se asigna una expresión musical a una variable
+con el nombre @code{traLaLa}.
 
 @example
 traLaLa = @{ c'4 d'4 @}
 
 @example
 traLaLa = @{ c'4 d'4 @}
@@ -732,9 +896,10 @@ traLaLa = @{ c'4 d'4 @}
 
 @noindent
 
 
 @noindent
 
-También hay una forma de ámbito: en el ejemplo siguiente, el bloque
-@code{\layout} también contiene una variable @code{traLaLa}, que es
-independiente de la @code{\traLaLa} externa.
+También hay una forma de ámbito: en el ejemplo siguiente, el
+bloque @code{\layout} también contiene una variable
+@code{traLaLa}, que es independiente de la @code{\traLaLa}
+externa.
 
 @example
 traLaLa = @{ c'4 d'4 @}
 
 @example
 traLaLa = @{ c'4 d'4 @}
@@ -742,13 +907,13 @@ traLaLa = @{ c'4 d'4 @}
 @end example
 
 @c
 @end example
 
 @c
-En efecto, cada archivo de entrada constituye un ámbito, y cada bloque
-@code{\header}, @code{\midi} y @code{\layout} son ámbitos anidados
-dentro del ámbito de nivel superior.
+En efecto, cada archivo de entrada constituye un ámbito, y cada
+bloque @code{\header}, @code{\midi} y @code{\layout} son ámbitos
+anidados dentro del ámbito de nivel superior.
 
 
-Tanto las variables como los ámbitos están implementados en el sistema
-de módulos de GUILE.  A cada ámbito se adjunta un módulo anónimo de
-Scheme.  Una asignación de la forma:
+Tanto las variables como los ámbitos están implementados en el
+sistema de módulos de GUILE.  A cada ámbito se adjunta un módulo
+anónimo de Scheme.  Una asignación de la forma:
 
 @example
 traLaLa = @{ c'4 d'4 @}
 
 @example
 traLaLa = @{ c'4 d'4 @}
@@ -758,97 +923,143 @@ traLaLa = @{ c'4 d'4 @}
 se convierte internamente en una definición de Scheme:
 
 @example
 se convierte internamente en una definición de Scheme:
 
 @example
-(define traLaLa @var{Valor Scheme de `@code{... }'})
+(define traLaLa @var{Valor Scheme de `@code{@dots{}}'})
 @end example
 
 @end example
 
-Esto significa que las variables de LilyPond y las variables de Scheme
-se pueden mezclar con libertad.  En el ejemplo siguiente, se almacena
-un fragmento de música en la variable @code{traLaLa}, y se duplica
-usando Scheme.  El resultado se importa dentro de un bloque
-@code{\score} por medio de una segunda variable @code{twice}:
+Esto significa que las variables de LilyPond y las variables de
+Scheme se pueden mezclar con libertad.  En el ejemplo siguiente,
+se almacena un fragmento de música en la variable @code{traLaLa},
+y se duplica usando Scheme.  El resultado se importa dentro de un
+bloque @code{\score} por medio de una segunda variable
+@code{twice}:
 
 @lilypond[verbatim]
 traLaLa = { c'4 d'4 }
 
 
 @lilypond[verbatim]
 traLaLa = { c'4 d'4 }
 
-%% dummy action to deal with parser lookahead
-#(display "this needs to be here, sorry!")
-
 #(define newLa (map ly:music-deep-copy
   (list traLaLa traLaLa)))
 #(define twice
   (make-sequential-music newLa))
 
 #(define newLa (map ly:music-deep-copy
   (list traLaLa traLaLa)))
 #(define twice
   (make-sequential-music newLa))
 
-{ \twice }
+\twice
 @end lilypond
 
 @c Due to parser lookahead
 
 @end lilypond
 
 @c Due to parser lookahead
 
-En este ejemplo, la asignación se produce después de que el analizador
-sintáctico ha verificado que no ocurre nada interesante después de
-@code{traLaLa = @{ ... @}}.  Sin la sentencia muda del ejemplo
-anterior, la definición de @code{newLa} se ejecuta antes de que se
-defina @code{traLaLa}, produciendo un error de sintaxis.
+En realidad, éste es un ejemplo bastante interesante.  La
+asignación solo tiene lugar después de que el analizador
+sintáctico se ha asegurado de que no sigue nada parecido a
+@code{\addlyrics}, de manera que necesita comprobar lo que viene a
+continuación.  Lee el símbolo @code{#} y la expresión de Scheme
+siguiente @emph{sin} evaluarla, de forma que puede proceder a la
+asignación, y @emph{posteriormente} ejecutar el código de Scheme
+sin problema.
+
+@node Importación de Scheme dentro de LilyPond
+@subsection Importación de Scheme dentro de LilyPond
+@translationof Importing Scheme in LilyPond
+@funindex $
+@funindex #
+
+El ejemplo anterior muestra cómo @q{exportar} expresiones
+musicales desde la entrada al intérprete de Scheme.  Lo contrario
+también es posible.  Colocándolo después de @code{$}, un valor de
+Scheme se interpreta como si hubiera sido introducido en la
+sintaxis de LilyPond.  En lugar de definir @code{\twice}, el
+ejemplo anterior podría también haberse escrito como
+
+@example
+@dots{}
+$(make-sequential-music newLa)
+@end example
+
+Podemos utilizar @code{$} con una expresión de Scheme en cualquier
+lugar en el que usaríamos @code{\@var{nombre}} después de haber
+asignado la expresión de Scheme a una variable @var{nombre}.  Esta
+sustitución se produce dentro del @q{analizador léxico}, de manera
+que LilyPond no llega a darse cuenta de la diferencia.
+
+Sin embargo, existe un inconveniente, el de la medida del tiempo.
+Si hubiésemos estado usando @code{$} en vez de @code{#} para
+definir @code{newLa} en el ejemplo anterior, la siguiente
+definición de Scheme habría fracasado porque @code{traLaLa} no
+habría sido definida aún.  Para ver una explicación de este
+problema de momento temporal, véase @ref{Sintaxis del Scheme de
+LilyPond}.
+
+@funindex $@@
+@funindex #@@
+Un conveniente aspecto posterior pueden ser los operadores de
+@q{división de listas} @code{$@@} y @code{#@@} para la inserción
+de los elementos de una lista dentro del contexto circundante.
+Utilizándolos, la última parte del ejemplo se podría haber escrito
+como
+
+@example
+@dots{}
+@{ #@@newLa @}
+@end example
 
 
-El ejemplo anterior muestra cómo @q{exportar} expresiones musicales
-desde la entrada al intérprete de Scheme.  Lo contrario también es
-posible.  Envolviendo un valor de Scheme en la función
-@code{ly:export}, se interpreta un valor de Scheme como si hubiera
-sido introducido en la sintaxis de LilyPond.  En lugar de definir
-@code{\twice}, el ejemplo anterior podría también haberse escrito como
+Aquí, cada elemento de la lista que está almacenado en
+@code{newLa} se toma en secuencia y se inserta en la lista, como
+si hubiésemos escrito
 
 @example
 
 @example
-...
-@{ #(ly:export (make-sequential-music (list newLa))) @}
+@{ #(first newLa) #(second newLa) @}
 @end example
 
 @end example
 
-El código de Scheme se evalúa tan pronto como el analizador sintáctico
-lo encuentra.  Para definir código de Scheme dentro de un macro (para
-llamarse más tarde), utilice @ref{Funciones vacías}, o bien
+Ahora bien, en todas esas formas, el código de Scheme se evalúa en
+el momento en que el código de entrada aún se está procesando, ya
+sea en el analizador léxico o en el analizador sintáctico.  Si
+necesitamos que se ejecute en un momento posterior, debemos
+consultar @ref{Funciones de Scheme vacías}, o almacenarlo dentro
+de un procedimiento:
 
 @example
 #(define (nopc)
   (ly:set-option 'point-and-click #f))
 
 
 @example
 #(define (nopc)
   (ly:set-option 'point-and-click #f))
 
-...
+@dots{}
 #(nopc)
 @{ c'4 @}
 @end example
 
 @knownissues
 
 #(nopc)
 @{ c'4 @}
 @end example
 
 @knownissues
 
-No es posible mezclar variables de Scheme y de LilyPond con la opción
-@code{--safe}.
+No es posible mezclar variables de Scheme y de LilyPond con la
+opción @option{--safe}.
 
 
 @node Propiedades de los objetos
 @subsection Propiedades de los objetos
 @translationof Object properties
 
 
 
 @node Propiedades de los objetos
 @subsection Propiedades de los objetos
 @translationof Object properties
 
-Las propiedades de los objetos se almacenan en LilyPond en forma de
-cadenas de listas-A, que son listas de listas-A.  Las propiedades se
-establecen añadiendo valores al principio de la lista de propiedades.
-Las propiedades se leen extrayendo valores de las listas-A.
+Las propiedades de los objetos se almacenan en LilyPond en forma
+de cadenas de listas-A, que son listas de listas-A.  Las
+propiedades se establecen añadiendo valores al principio de la
+lista de propiedades.  Las propiedades se leen extrayendo valores
+de las listas-A.
 
 
-El establecimiento de un valor nuevo para una propiedad requiere la
-asignación de un valor a la lista-A con una clave y un valor.  La
-sintaxis de LilyPond para hacer esto es la siguiente:
+El establecimiento de un valor nuevo para una propiedad requiere
+la asignación de un valor a la lista-A con una clave y un valor.
+La sintaxis de LilyPond para hacer esto es la siguiente:
 
 @example
 
 @example
-\override Stem #'thickness = #2.6
+\override Stem.thickness = #2.6
 @end example
 
 Esta instrucción ajusta el aspecto de las plicas.  Se añade una
 @end example
 
 Esta instrucción ajusta el aspecto de las plicas.  Se añade una
-entrada de lista-A @code{'(thickness . 2.6)} a la lista de propiedades
-de un objeto @code{Stem}.  @code{thickness} se mide a partir del
-grosor de las líneas del pentagrama, y así estas plicas serán
-@code{2.6} veces el grosor de las líneas del pentagrama.  Esto hace
-que las plicas sean casi el doble de gruesas de lo normal.  Para
-distinguir entre las variables que se definen en los archivos de
-entrada (como @code{veintiCuatro} en el ejemplo anterior) y las
-variables de los objetos internos, llamaremos a las últimas
-@q{propiedades} y a las primeras @q{variables.}  Así, el objeto plica
-tiene una propiedad @code{thickness} (grosor), mientras que
-@code{veintiCuatro} es una variable.
+entrada de lista-A @code{'(thickness . 2.6)} a la lista de
+propiedades de un objeto @code{Stem}.  @code{thickness} se mide a
+partir del grosor de las líneas del pentagrama, y así estas plicas
+serán @code{2.6} veces el grosor de las líneas del pentagrama.
+Esto hace que las plicas sean casi el doble de gruesas de lo
+normal.  Para distinguir entre las variables que se definen en los
+archivos de entrada (como @code{veintiCuatro} en el ejemplo
+anterior) y las variables de los objetos internos, llamaremos a
+las últimas @q{propiedades} y a las primeras @q{variables.}  Así,
+el objeto plica tiene una propiedad @code{thickness} (grosor),
+mientras que @code{veintiCuatro} es una variable.
 
 @cindex propiedades frente a variables
 @cindex variables frente a propiedades
 
 @cindex propiedades frente a variables
 @cindex variables frente a propiedades
@@ -861,118 +1072,156 @@ tiene una propiedad @code{thickness} (grosor), mientras que
 @subsection Variables de LilyPond compuestas
 @translationof LilyPond compound variables
 
 @subsection Variables de LilyPond compuestas
 @translationof LilyPond compound variables
 
-@subheading Desplazamientos
+@menu
+* Desplazamientos::
+* Fracciones::
+* Dimensiones::
+* Listas-A de propiedades::
+* Cadenas de listas-A::
+@end menu
+
 
 
-Los desplazamientos bidimensionales (coordenadas X e Y) se almacenan
-como @code{parejas}.  El @code{car} del desplazamiento es la
-coordenada X, y el @code{cdr} es la coordenada Y.
+@node Desplazamientos
+@unnumberedsubsubsec Desplazamientos
+@translationof Offsets
+
+Los desplazamientos bidimensionales (coordenadas X e Y) se
+almacenan como @emph{parejas}.  El @code{car} del desplazamiento
+es la coordenada X, y el @code{cdr} es la coordenada Y.
 
 @example
 
 @example
-\override TextScript #'extra-offset = #'(1 . 2)
+\override TextScript.extra-offset = #'(1 . 2)
 @end example
 
 Esto asigna la pareja @code{(1 . 2)} a la propiedad
 @end example
 
 Esto asigna la pareja @code{(1 . 2)} a la propiedad
-@code{extra-offset} del objeto TextScript.  Estos números se miden en
-espacios de pentagrama, y así esta instrucción mueve el objeto un
-espacio de pentagrama a la derecha, y dos espacios hacia arriba.
+@code{extra-offset} del objeto TextScript.  Estos números se miden
+en espacios de pentagrama, y así esta instrucción mueve el objeto
+un espacio de pentagrama a la derecha, y dos espacios hacia
+arriba.
 
 Los procedimientos para trabajar con desplazamientos están en
 @file{scm/lily-library.scm}.
 
 
 Los procedimientos para trabajar con desplazamientos están en
 @file{scm/lily-library.scm}.
 
-@subheading Dimensiones
-
-Las parejas se usan también para almacenar intervalos, que representan
-un rango de números desde el mínimo (el @code{car}) hasta el máximo
-(el @code{cdr}).  Los intervalos se usan para almacenar las
-dimensiones en X y en Y de los objetos imprimibles.  Para dimensiones
-en X, el @code{car} es la coordenada X de la parte izquierda, y el
-@code{cdr} es la coordenada X de la parte derecha.  Para las
-dimensiones en Y, el @code{car} es la coordenada inferior, y el
-@code{cdr} es la coordenada superior.
+@node Fracciones
+@unnumberedsubsubsec Fracciones
+@subheading Fractions
+
+Las fracciones tal y como se utilizan por parte de LilyPond se
+almacenan, de nuevo, como @emph{parejas}, esta vez de enteros sin
+signo.  Mientras que Scheme es capaz de representar números
+racionaes como un tipo nativo, musicalmente @samp{2/4} y
+@samp{1/2} no son lo mismo, y necesitamos poder distinguir entre
+ellos.  De igual forma, no existe el concepto de @q{fracciones}
+negativas en LilyPond.  Así pues, @code{2/4} en LilyPond significa
+@code{(2 . 4)} en Scheme, y @code{#2/4} en LilyPond significa
+@code{1/2} en Scheme.
+
+
+@node Dimensiones
+@unnumberedsubsubsec Dimensiones
+@translationof Extents
+
+Las parejas se usan también para almacenar intervalos, que
+representan un rango de números desde el mínimo (el @code{car})
+hasta el máximo (el @code{cdr}).  Los intervalos se usan para
+almacenar las dimensiones en X y en Y de los objetos imprimibles.
+Para dimensiones en X, el @code{car} es la coordenada X de la
+parte izquierda, y el @code{cdr} es la coordenada X de la parte
+derecha.  Para las dimensiones en Y, el @code{car} es la
+coordenada inferior, y el @code{cdr} es la coordenada superior.
 
 Los procedimientos para trabajar con intervalos están en
 @file{scm/lily-library.scm}.  Se deben usar estos procedimientos
 siempre que sea posible, para asegurar la consistencia del código.
 
 
 Los procedimientos para trabajar con intervalos están en
 @file{scm/lily-library.scm}.  Se deben usar estos procedimientos
 siempre que sea posible, para asegurar la consistencia del código.
 
-@subheading Listas-A de propiedades
 
 
-Una lista-A de propiedades es una estructura de datos de LilyPond que
-es una lista-A cuyas claves son propiedades y cuyos valores son
-expresiones de Scheme que dan el valor deseado de la propiedad.
+@node Listas-A de propiedades
+@unnumberedsubsubsec Listas-A de propiedades
+@translationof Property alists
+
+Una lista-A de propiedades es una estructura de datos de LilyPond
+que es una lista-A cuyas claves son propiedades y cuyos valores
+son expresiones de Scheme que dan el valor deseado de la
+propiedad.
 
 
-Las propiedades de LilyPond son símbolos de Scheme, como por ejemplo
-@code{'thickness}.
+Las propiedades de LilyPond son símbolos de Scheme, como por
+ejemplo @code{'thickness}.
 
 
-@subheading Cadenas de listas-A
+
+@node Cadenas de listas-A
+@unnumberedsubsubsec Cadenas de listas-A
+@translationof Alist chains
 
 Una cadena de listas-A es una lista que contiene listas-A de
 propiedades.
 
 El conjunto de todas las propiedades que se aplican a un grob se
 almacena por lo general como una cadena de listas-A.  Para poder
 
 Una cadena de listas-A es una lista que contiene listas-A de
 propiedades.
 
 El conjunto de todas las propiedades que se aplican a un grob se
 almacena por lo general como una cadena de listas-A.  Para poder
-encontrar el valor de una propiedad determinada que debería tener un
-grob, se busca por todas las listas-A de la cadena, una a una,
+encontrar el valor de una propiedad determinada que debería tener
+un grob, se busca por todas las listas-A de la cadena, una a una,
 tratando de encontrar una entrada que contenga la clave de la
 propiedad.  Se devuelve la primera entrada de lista-A que se
 encuentre, y el valor es el valor de la propiedad.
 
 tratando de encontrar una entrada que contenga la clave de la
 propiedad.  Se devuelve la primera entrada de lista-A que se
 encuentre, y el valor es el valor de la propiedad.
 
-El procedimiento de Scheme @code{chain-assoc-get} se usa normalmente
-para obtener los valores de propiedades.
+El procedimiento de Scheme @code{chain-assoc-get} se usa
+normalmente para obtener los valores de propiedades.
 
 @node Representación interna de la música
 @subsection Representación interna de la música
 @translationof Internal music representation
 
 
 @node Representación interna de la música
 @subsection Representación interna de la música
 @translationof Internal music representation
 
-Internamente, la música se representa como una lista de Scheme.  La
-lista contiene varios elementos que afectan a la salida impresa.  El
-análisis sintáctico es el proceso de convertir la música de la
-representación de entrada de LilyPond a la representación interna de
-Scheme.
+Internamente, la música se representa como una lista de Scheme.
+La lista contiene varios elementos que afectan a la salida
+impresa.  El análisis sintáctico es el proceso de convertir la
+música de la representación de entrada de LilyPond a la
+representación interna de Scheme.
 
 
-Cuando se analiza una expresión musical, se convierte en un conjunto
-de objetos musicales de Scheme.  La propiedad definitoria de un objeto
-musical es que ocupa un tiempo.  El tiempo que ocupa se llama
-@emph{duración}.  Las duraciones se expresan como un número racional
-que mide la longitud del objeto musical en redondas.
+Cuando se analiza una expresión musical, se convierte en un
+conjunto de objetos musicales de Scheme.  La propiedad definitoria
+de un objeto musical es que ocupa un tiempo.  El tiempo que ocupa
+se llama @emph{duración}.  Las duraciones se expresan como un
+número racional que mide la longitud del objeto musical en
+redondas.
 
 Un objeto musical tiene tres clases de tipos:
 @itemize
 @item
 
 Un objeto musical tiene tres clases de tipos:
 @itemize
 @item
-nombre musical: Cada expresión musical tiene un nombre.  Por ejemplo,
-una nota lleva a un @rinternals{NoteEvent}, y @code{\simultaneous}
-lleva a una @rinternals{SimultaneousMusic}.  Hay una lista de todas
-las expresiones disponibles en el manual de Referencia de
-funcionamiento interno, bajo el epígrafe @rinternals{Music
-expressions}.
+nombre musical: Cada expresión musical tiene un nombre.  Por
+ejemplo, una nota lleva a un @rinternals{NoteEvent}, y
+@code{\simultaneous} lleva a una @rinternals{SimultaneousMusic}.
+Hay una lista de todas las expresiones disponibles en el manual de
+Referencia de funcionamiento interno, bajo el epígrafe
+@rinternals{Music expressions}.
 
 @item
 @q{type} (tipo) o interface: Cada nombre musical tiene varios
 
 @item
 @q{type} (tipo) o interface: Cada nombre musical tiene varios
-@q{tipos} o interfaces, por ejemplo, una nota es un @code{event}, pero
-también es un @code{note-event}, un @code{rhythmic-event}, y un
-@code{melodic-event}.  Todas las clases de música están listadas en el
-manual de Referencia de funcionamiento interno, bajo el epígrafe
-@rinternals{Music classes}.
+@q{tipos} o interfaces, por ejemplo, una nota es un @code{event},
+pero también es un @code{note-event}, un @code{rhythmic-event}, y
+un @code{melodic-event}.  Todas las clases de música están
+listadas en el manual de Referencia de funcionamiento interno,
+bajo el epígrafe @rinternals{Music classes}.
 
 @item
 
 @item
-objeto de C++: Cada objeto musical está representado por un objeto de
-la clase @code{Music} de C++.
+objeto de C++: Cada objeto musical está representado por un objeto
+de la clase @code{Music} de C++.
 @end itemize
 
 La información real de una expresión musical se almacena en
 @end itemize
 
 La información real de una expresión musical se almacena en
-propiedades.  Por ejemplo, un @rinternals{NoteEvent} tiene propiedades
-@code{pitch} y @code{duration} que almacenan la altura y la duración
-de esa nota.  Hay una lista de todas la propiedades disponibles en el
-manual de Referencia de funcionamiento interno, bajo el epígrafe
-@rinternals{Music properties}.
+propiedades.  Por ejemplo, un @rinternals{NoteEvent} tiene
+propiedades @code{pitch} y @code{duration} que almacenan la altura
+y la duración de esa nota.  Hay una lista de todas la propiedades
+disponibles en el manual de Referencia de funcionamiento interno,
+bajo el epígrafe @rinternals{Music properties}.
 
 Una expresión musical compuesta es un objeto musical que contiene
 
 Una expresión musical compuesta es un objeto musical que contiene
-otros objetos musicales dentro de sus propiedades.  Se puede almacenar
-una lista de objetos dentro de la propiedad @code{elements} de un
-objeto musical, o un único objeto musical @q{hijo} dentro de la
-propiedad @code{element}.  Por ejemplo, @rinternals{SequentialMusic}
-tiene su hijo dentro de @code{elements}, y @rinternals{GraceMusic}
-tiene su argumento único dentro de @code{element}.  El cuerpo de una
-repetición se almacena dentro de la propiedad @code{element} de
+otros objetos musicales dentro de sus propiedades.  Se puede
+almacenar una lista de objetos dentro de la propiedad
+@code{elements} de un objeto musical, o un único objeto musical
+@q{hijo} dentro de la propiedad @code{element}.  Por ejemplo,
+@rinternals{SequentialMusic} tiene su hijo dentro de
+@code{elements}, y @rinternals{GraceMusic} tiene su argumento
+único dentro de @code{element}.  El cuerpo de una repetición se
+almacena dentro de la propiedad @code{element} de
 @rinternals{RepeatedMusic}, y las alternativas dentro de
 @code{elements}.
 
 @rinternals{RepeatedMusic}, y las alternativas dentro de
 @code{elements}.
 
@@ -980,8 +1229,8 @@ repetición se almacena dentro de la propiedad @code{element} de
 @section Construir funciones complicadas
 @translationof Building complicated functions
 
 @section Construir funciones complicadas
 @translationof Building complicated functions
 
-Esta sección explica cómo reunir la información necesaria para crear
-funciones musicales complicadas.
+Esta sección explica cómo reunir la información necesaria para
+crear funciones musicales complicadas.
 
 @menu
 * Presentación de las expresiones musicales::
 
 @menu
 * Presentación de las expresiones musicales::
@@ -1001,9 +1250,10 @@ funciones musicales complicadas.
 @cindex displayMusic
 @funindex \displayMusic
 
 @cindex displayMusic
 @funindex \displayMusic
 
-Si se está escribiendo una función musical, puede ser muy instructivo
-examinar cómo se almacena internamente una expresión musical.  Esto se
-puede hacer con la función musical @code{\displayMusic}
+Si se está escribiendo una función musical, puede ser muy
+instructivo examinar cómo se almacena internamente una expresión
+musical.  Esto se puede hacer con la función musical
+@code{\displayMusic}.
 
 @example
 @{
 
 @example
 @{
@@ -1019,80 +1269,126 @@ imprime lo siguiente:
   'SequentialMusic
   'elements
   (list (make-music
   'SequentialMusic
   'elements
   (list (make-music
-          'EventChord
-          'elements
+          'NoteEvent
+          'articulations
           (list (make-music
           (list (make-music
-                  'NoteEvent
-                  'duration
-                  (ly:make-duration 2 0 1 1)
-                  'pitch
-                  (ly:make-pitch 0 0 0))
-                (make-music
                   'AbsoluteDynamicEvent
                   'text
                   'AbsoluteDynamicEvent
                   'text
-                  "f")))))
+                  "f"))
+          'duration
+          (ly:make-duration 2 0 1/1)
+          'pitch
+          (ly:make-pitch 0 0 0))))
 @end example
 
 De forma predeterminada, LilyPond imprime estos mensajes sobre la
 @end example
 
 De forma predeterminada, LilyPond imprime estos mensajes sobre la
-consola junto al resto de los mensajes.  Para separar estos mensajes y
-guardar el resultado de @code{\display@{LOQUESEA@}}, redirija la
-salida a un archivo.
+consola junto al resto de los mensajes.  Para separar estos
+mensajes y guardar el resultado de @code{\display@{LOQUESEA@}},
+puede especificar que se use un puerto de salida opcional:
+
+@example
+@{
+  \displayMusic #(open-output-file "display.txt") @{ c'4\f @}
+@}
+@end example
 
 
+Esto sobreescribe el archivo de salida anterior cada vez ques e
+llama; si necesitamos escribir más de una expresión, debemos usar
+una variable para el puerto y reutilizarla:
 @example
 @example
-lilypond archivo.ly >salida.txt
+@{
+  port = #(open-output-file "display.txt")
+  \displayMusic \port @{ c'4\f @}
+  \displayMusic \port @{ d'4 @}
+  #(close-output-port port)
+@}
 @end example
 
 @end example
 
-Con la aplicación de un poco de formateo, la información anterior es
-fácil de leer,
+El manual de Guile describe los puertos detalladamente.  Solo es
+realmente necesario cerrar el puerto si necesitamos leer el
+archivo antes de que LilyPond termine; en el primer ejemplo, no
+nos hemos molestado en hacerlo.
+
+Un poco de reformateo hace a la información anterior más fácil de
+leer:
 
 @example
 (make-music 'SequentialMusic
 
 @example
 (make-music 'SequentialMusic
-  'elements (list (make-music 'EventChord
-                    'elements (list (make-music 'NoteEvent
-                                      'duration (ly:make-duration 2 0 1 1)
-                                      'pitch (ly:make-pitch 0 0 0))
-                                    (make-music 'AbsoluteDynamicEvent
-                                      'text "f")))))
+  'elements (list
+            (make-music 'NoteEvent
+               'articulations (list
+                              (make-music 'AbsoluteDynamicEvent
+                                'text
+                                "f"))
+              'duration (ly:make-duration 2 0 1/1)
+              'pitch    (ly:make-pitch 0 0 0))))
 @end example
 
 @end example
 
-Una secuencia musical @code{@{ ... @}} tiene el nombre
-@code{SequentialMusic}, y sus expresiones internas se almacenan coma
-una lista dentro de su propiedad @code{'elements}.  Una nota se
-representa como una expresión @code{EventChord} que contiene un objeto
-@code{NoteEvent} (que almacena las propiedades de duración y altura) y
-cualquier información adicional (en este caso, un evento
-@code{AbsoluteDynamicEvent} con una propiedad @code{"f"} de texto.
+Una secuencia musical @code{@{ @dots{} @}} tiene el nombre
+@code{SequentialMusic}, y sus expresiones internas se almacenan
+coma una lista dentro de su propiedad @code{'elements}.  Una nota
+se representa como un objeto @code{NoteEvent} (que almacena las
+propiedades de duración y altura) con información adjunta (en este
+caso, un evento @code{AbsoluteDynamicEvent} con una propiedad
+@code{"f"} de texto) almacenada en su propiedad
+@code{articulations}.
+
+@funindex{\void}
 
 
+@code{\displayMusic} devuelve la música que imprime en la consola,
+y por ello se interpretará al tiempo que se imprime en la consola.
+Para evitar la interpretación, escriba @code{\void} antes de
+@code{\displayMusic}.
 
 @node Propiedades musicales
 @subsection Propiedades musicales
 @translationof Music properties
 
 
 @node Propiedades musicales
 @subsection Propiedades musicales
 @translationof Music properties
 
-@c TODO -- make sure we delineate between @emph{music} properties,
-@c @emph{context} properties, and @emph{layout} properties.  These
-@c are potentially confusing.
+@ignore
+TODO -- make sure we delineate between @emph{music} properties,
+@emph{context} properties, and @emph{layout} properties.  These
+are potentially confusing.
+@end ignore
 
 
-El objeto @code{NoteEvent} es el primer objeto de la propiedad
-@code{'elements} de @code{someNote}.
+Veamos un ejemplo:
 
 @example
 someNote = c'
 \displayMusic \someNote
 ===>
 
 @example
 someNote = c'
 \displayMusic \someNote
 ===>
+(make-music
+  'NoteEvent
+  'duration
+  (ly:make-duration 2 0 1/1)
+  'pitch
+  (ly:make-pitch 0 0 0))
+@end example
+
+El objeto @code{NoteEvent} es la representación de
+@code{someNote}.  Sencillo.  ¿Y si ponemos el c' dentro de un
+acorde?
+
+@example
+someNote = <c'>
+\displayMusic \someNote
+===>
 (make-music
   'EventChord
   'elements
   (list (make-music
           'NoteEvent
           'duration
 (make-music
   'EventChord
   'elements
   (list (make-music
           'NoteEvent
           'duration
-          (ly:make-duration 2 0 1 1)
+          (ly:make-duration 2 0 1/1)
           'pitch
           (ly:make-pitch 0 0 0))))
 @end example
 
           'pitch
           (ly:make-pitch 0 0 0))))
 @end example
 
-La función @code{display-scheme-music} es la función que se usa por
-parte de @code{\displayMusic} para imprimir la representación de
-Scheme de una expresión musical.
+Ahora el objeto @code{NoteEvent} es el primer objeto de la
+propiedad @code{'elements} de @code{someNote}.
+
+La función @code{display-scheme-music} es la función que se usa
+por parte de @code{\displayMusic} para imprimir la representación
+de Scheme de una expresión musical.
 
 @example
 #(display-scheme-music (first (ly:music-property someNote 'elements)))
 
 @example
 #(display-scheme-music (first (ly:music-property someNote 'elements)))
@@ -1100,7 +1396,7 @@ Scheme de una expresión musical.
 (make-music
   'NoteEvent
   'duration
 (make-music
   'NoteEvent
   'duration
-  (ly:make-duration 2 0 1 1)
+  (ly:make-duration 2 0 1/1)
   'pitch
   (ly:make-pitch 0 0 0))
 @end example
   'pitch
   (ly:make-pitch 0 0 0))
 @end example
@@ -1116,8 +1412,8 @@ Después se accede a la altura de la nota a través de la propiedad
 (ly:make-pitch 0 0 0)
 @end example
 
 (ly:make-pitch 0 0 0)
 @end example
 
-La altura de la nota se puede cambiar estableciendo el valor de esta
-propiedad @code{'pitch},
+La altura de la nota se puede cambiar estableciendo el valor de
+esta propiedad @code{'pitch}.
 
 @funindex \displayLilyMusic
 
 
 @funindex \displayLilyMusic
 
@@ -1127,7 +1423,7 @@ propiedad @code{'pitch},
        (ly:make-pitch 0 1 0)) ;; establecer la altura a d'.
 \displayLilyMusic \someNote
 ===>
        (ly:make-pitch 0 1 0)) ;; establecer la altura a d'.
 \displayLilyMusic \someNote
 ===>
-d'
+d'4
 @end example
 
 
 @end example
 
 
@@ -1135,9 +1431,10 @@ d'
 @subsection Duplicar una nota con ligaduras (ejemplo)
 @translationof Doubling a note with slurs (example)
 
 @subsection Duplicar una nota con ligaduras (ejemplo)
 @translationof Doubling a note with slurs (example)
 
-Supongamos que queremos crear una función que convierte una entrada
-como @code{a} en @code{a( a)}.  Comenzamos examinando la
-representación interna de la música con la que queremos terminar.
+Supongamos que queremos crear una función que convierte una
+entrada como @code{a} en @code{@{ a( a) @}}.  Comenzamos
+examinando la representación interna de la música con la que
+queremos terminar.
 
 @example
 \displayMusic@{ a'( a') @}
 
 @example
 \displayMusic@{ a'( a') @}
@@ -1146,71 +1443,68 @@ representación interna de la música con la que queremos terminar.
   'SequentialMusic
   'elements
   (list (make-music
   'SequentialMusic
   'elements
   (list (make-music
-          'EventChord
-          'elements
+          'NoteEvent
+          'articulations
           (list (make-music
           (list (make-music
-                  'NoteEvent
-                  'duration
-                  (ly:make-duration 2 0 1 1)
-                  'pitch
-                  (ly:make-pitch 0 5 0))
-                (make-music
                   'SlurEvent
                   'span-direction
                   'SlurEvent
                   'span-direction
-                  -1)))
+                  -1))
+          'duration
+          (ly:make-duration 2 0 1/1)
+          'pitch
+          (ly:make-pitch 0 5 0))
         (make-music
         (make-music
-          'EventChord
-          'elements
+          'NoteEvent
+          'articulations
           (list (make-music
           (list (make-music
-                  'NoteEvent
-                  'duration
-                  (ly:make-duration 2 0 1 1)
-                  'pitch
-                  (ly:make-pitch 0 5 0))
-                (make-music
                   'SlurEvent
                   'span-direction
                   'SlurEvent
                   'span-direction
-                  1)))))
+                  1))
+          'duration
+          (ly:make-duration 2 0 1/1)
+          'pitch
+          (ly:make-pitch 0 5 0))))
 @end example
 
 @end example
 
-Las malas noticias son que las expresiones @code{SlurEvent} se deben
-añadir @q{dentro} de la nota (o para ser más exactos, dentro de la
-expresión @code{EventChord}).
+La mala noticia es que las expresiones @code{SlurEvent} se deben
+añadir @q{dentro} de la nota (dentro de la propiedad
+@code{articulations}).
 
 
-Ahora examinamos la entrada,
+Ahora examinamos la entrada.
 
 @example
 
 @example
+\displayMusic a'
+===>
 (make-music
 (make-music
-  'SequentialMusic
-  'elements
-  (list (make-music
-          'EventChord
-          'elements
-          (list (make-music
-                  'NoteEvent
-                  'duration
-                  (ly:make-duration 2 0 1 1)
-                  'pitch
-                  (ly:make-pitch 0 5 0))))))
+  'NoteEvent
+  'duration
+  (ly:make-duration 2 0 1/1)
+  'pitch
+  (ly:make-pitch 0 5 0))))
 @end example
 
 @end example
 
-Así pues, en nuestra función, tenemos que clonar esta expresión (de
-forma que tengamos dos notas para construir la secuencia), añadir
-@code{SlurEvents} a la propiedad @code{'elements} de cada una de
-ellas, y por último hacer una secuencia @code{SequentialMusic} con los
-dos @code{EventChords}.
+Así pues, en nuestra función, tenemos que clonar esta expresión
+(de forma que tengamos dos notas para construir la secuencia),
+añadir @code{SlurEvent} a la propiedad @code{'articulations} de
+cada una de ellas, y por último hacer una secuencia
+@code{SequentialMusic} con los dos elementos @code{NoteEvent}.
+Para añadir a una propiedad, es útil saber que una propiedad no
+establecida se lee como @code{'()}, la lista vacía, así que no se
+requiere ninguna comprobación especial antes de que pongamos otro
+elemento delante de la propiedad @code{articulations}.
+
 
 @example
 
 @example
-doubleSlur = #(define-music-function (parser location note) (ly:music?)
+doubleSlur = #(define-music-function (note) (ly:music?)
          "Return: @{ note ( note ) @}.
          "Return: @{ note ( note ) @}.
-         `note' is supposed to be an EventChord."
+         `note' is supposed to be a single note."
          (let ((note2 (ly:music-deep-copy note)))
          (let ((note2 (ly:music-deep-copy note)))
-           (set! (ly:music-property note 'elements)
+           (set! (ly:music-property note 'articulations)
                  (cons (make-music 'SlurEvent 'span-direction -1)
                  (cons (make-music 'SlurEvent 'span-direction -1)
-                       (ly:music-property note 'elements)))
-           (set! (ly:music-property note2 'elements)
+                       (ly:music-property note 'articulations)))
+           (set! (ly:music-property note2 'articulations)
                  (cons (make-music 'SlurEvent 'span-direction 1)
                  (cons (make-music 'SlurEvent 'span-direction 1)
-                       (ly:music-property note2 'elements)))
+                       (ly:music-property note2 'articulations)))
            (make-music 'SequentialMusic 'elements (list note note2))))
 @end example
 
            (make-music 'SequentialMusic 'elements (list note note2))))
 @end example
 
@@ -1220,176 +1514,193 @@ doubleSlur = #(define-music-function (parser location note) (ly:music?)
 @translationof Adding articulation to notes (example)
 
 La manera fácil de añadir articulación a las notas es mezclar dos
 @translationof Adding articulation to notes (example)
 
 La manera fácil de añadir articulación a las notas es mezclar dos
-expresiones musicales en un solo contexto, como se explica en
-@ruser{Crear contextos}.  Sin embargo, supongamos que queremos
-escribir una función musical que lo haga.
-
-Una @code{$variable} dentro de la notación @code{#@{...#@}} es como
-una @code{\variable} normal en la notación clásica de LilyPond.
-Sabemos que
+expresiones musicales en un solo contexto.  Sin embargo,
+supongamos que queremos escribir una función musical que lo haga.
+Esto tiene la ventaja adicional de que podemos usar esa función
+musical para añadir una articulación (como una instrucción de
+digitación) a una nota única dentro de un acorde, lo cual no es
+posible si nos limitamos a mezclar fragmentos de música
+independientes.
+
+Una @code{$variable} dentro de la notación @code{#@{@dots{}#@}} es
+como una @code{\variable} normal en la notación clásica de
+LilyPond.  Sabemos que
 
 @example
 @{ \music -. -> @}
 @end example
 
 @noindent
 
 @example
 @{ \music -. -> @}
 @end example
 
 @noindent
-no funciona en LilyPond.  Podríamos evitar este problema adjuntando la
-articulación a una nota falsa,
+no funciona en LilyPond.  Podríamos evitar este problema
+adjuntando la articulación a un acorde vacío,
 
 @example
 
 @example
-@{ << \music s1*0-.-> @}
+@{ << \music <> -. -> >> @}
 @end example
 
 @noindent
 @end example
 
 @noindent
-pero a los efectos de este ejemplo, aprenderemos ahora cómo hacerlo en
-Scheme.  Empezamos examinando nuestra entrada y la salida deseada,
+pero a los efectos de este ejemplo, aprenderemos ahora cómo
+hacerlo en Scheme.  Empezamos examinando nuestra entrada y la
+salida deseada.
 
 @example
 %  input
 \displayMusic c4
 ===>
 (make-music
 
 @example
 %  input
 \displayMusic c4
 ===>
 (make-music
-  'EventChord
-  'elements
-  (list (make-music
-          'NoteEvent
-          'duration
-          (ly:make-duration 2 0 1 1)
-          'pitch
-          (ly:make-pitch -1 0 0))))
+  'NoteEvent
+  'duration
+  (ly:make-duration 2 0 1/1)
+  'pitch
+  (ly:make-pitch -1 0 0))))
 =====
 %  desired output
 \displayMusic c4->
 ===>
 (make-music
 =====
 %  desired output
 \displayMusic c4->
 ===>
 (make-music
-  'EventChord
-  'elements
+  'NoteEvent
+  'articulations
   (list (make-music
   (list (make-music
-          'NoteEvent
-          'duration
-          (ly:make-duration 2 0 1 1)
-          'pitch
-          (ly:make-pitch -1 0 0))
-        (make-music
           'ArticulationEvent
           'articulation-type
           'ArticulationEvent
           'articulation-type
-          "marcato")))
+          "accent"))
+  'duration
+  (ly:make-duration 2 0 1/1)
+  'pitch
+  (ly:make-pitch -1 0 0))
 @end example
 
 Vemos que una nota (@code{c4}) se representa como una expresión
 @end example
 
 Vemos que una nota (@code{c4}) se representa como una expresión
-@code{EventChord}, con una expresión @code{NoteEvent} en su lista de
-elementos.  Para añadir una articulación de marcato, se debe añadir
-una expresión @code{ArticulationEvent} a la propiedad elements de la
-expresión @code{EventChord}.
+@code{NoteEvent}.  Para añadir una articulación de acento, se debe
+añadir una expresión @code{ArticulationEvent} a la propiedad
+@code{articulations} de la expresión @code{NoteEvent}.
 
 Para construir esta función, empezamos con
 
 @example
 
 Para construir esta función, empezamos con
 
 @example
-(define (add-marcato event-chord)
-  "Add a marcato ArticulationEvent to the elements of `event-chord',
-  which is supposed to be an EventChord expression."
-  (let ((result-event-chord (ly:music-deep-copy event-chord)))
-    (set! (ly:music-property result-event-chord 'elements)
-          (cons (make-music 'ArticulationEvent
-                  'articulation-type "marcato")
-                (ly:music-property result-event-chord 'elements)))
-    result-event-chord))
+(define (add-accent note-event)
+  "Add an accent ArticulationEvent to the articulations of `note-event',
+  which is supposed to be a NoteEvent expression."
+  (set! (ly:music-property note-event 'articulations)
+        (cons (make-music 'ArticulationEvent
+                'articulation-type "accent")
+              (ly:music-property note-event 'articulations)))
+  note-event)
 @end example
 
 La primera línea es la forma de definir una función en Scheme: el
 @end example
 
 La primera línea es la forma de definir una función en Scheme: el
-nombre de la función es @code{add-marcato}, y tiene una variable
-llamada @code{event-chord}.  En Scheme, el tipo de variable suele
+nombre de la función es @code{add-accent}, y tiene una variable
+llamada @code{note-event}.  En Scheme, el tipo de variable suele
 quedar claro a partir de su nombre (¡esto también es una buena
 práctica en otros lenguajes de programación!)
 
 @example
 quedar claro a partir de su nombre (¡esto también es una buena
 práctica en otros lenguajes de programación!)
 
 @example
-"Add a marcato..."
+"Add an accent@dots{}"
 @end example
 
 @noindent
 es una descripción de lo que hace la función.  No es estrictamente
 @end example
 
 @noindent
 es una descripción de lo que hace la función.  No es estrictamente
-necesaria, pero de igual forma que los nombres claros de variable, es
-una buena práctica.
-
-@example
-(let ((result-event-chord (ly:music-deep-copy event-chord)))
-@end example
-
-Se usa @code{let} para declarar las variables locales.  Aquí usamos
-una variable local, llamada @code{result-event-chord}, a la que le
-damos el valor @code{(ly:music-deep-copy event-chord)}.
-@code{ly:music-deep-copy} es una función específica de LilyPond, como
-todas las funciones que comienzan por @code{ly:}.  Se usa para hacer
-una copia de una expresión musical.  Aquí, copiamos @code{event-chord}
-(el parámetro de la función).  Recuerde que nuestro propósito es
-añadir un marcato a una expresión @code{EventChord}.  Es mejor no
-modificar el @code{EventChord} que se ha dado como argumento, porque
-podría utilizarse en algún otro lugar.
-
-Ahora tenemos un @code{result-event-chord}, que es una expresión
-@code{NoteEventChord} y es una copia de @code{event-chord}.  Añadimos
-el marcato a su propiedad de la lista de @code{'elements}.
+necesaria, pero de igual forma que los nombres claros de variable,
+es una buena práctica.
+
+Se preguntará por qué modificamos el evento de nota directamente
+en lugar de trabajar sobre una copia (se puede usar
+@code{ly:music-deep-copy} para ello).  La razón es un contrato
+silencioso: se permite que las funciones musicales modifiquen sus
+argumentos; o bien se generan partiendo de cero (como la entrada
+del usuario) o están ya copiadas (referenciar una variable de
+música con @samp{\name} o la música procedente de expresiones de
+Scheme inmediatas @samp{$(@dots{})} proporcionan una copia).  Dado
+que sería ineficiente crear copias innecesarias, el valor devuelto
+de una función musical @emph{no} se copia.  Así pues, para cumplir
+dicho contrato, no debemos usar ningún argumento más de una vez, y
+devolverlo cuenta como una vez.
+
+En un ejemplo anterior, hemos construido música mediante la
+repetición de un argumento musical dado.  En tal caso, al menos
+una repetidión tuvo que ser una copia de sí misma.  Si no lo
+fuese, podrían ocurrir cosas muy extrañas.  Por ejemplo, si usamos
+@code{\relative} o @code{\transpose} sobre la música resultante
+que contiene los mismos elementos varias veces, estarían sujetos
+varias veces a la relativización o al transporte.  Si los
+asignamos a una variable de música, se rompe el curso porque hacer
+referencia a @samp{\name} creará de nuevo una copia que no retiene
+la identidad de los elementos repetidos.
+
+Ahora bien, aun cuando la función anterior no es una función
+musical, se usará normalmente dentro de funciones musicales.  Así
+pues, tiene sentido obedecer el mismo convenio que usamos para las
+funciones musicales: la entrada puede modificarse para producir la
+salida, y el código que llama es responsable de crear las copias
+si aún necesita el propio argumento sin modificar.  Si observamos
+las propias funciones de LilyPond como @code{music-map}, veremos
+que se atienen a los mismos principios.
+
+¿En qué punto nos encontramos?  Ahora tenemos un @code{note-event}
+que podemos modificar, no a causa de la utilización de
+@code{ly:music-deep-copy} sino por una explicación muy
+desarrollada.  Añadimos el acento a su propiedad de lista
+@code{'articulations}.
 
 @example
 
 @example
-(set! lugar valor-nuevo)
+(set! place new-value)
 @end example
 
 @end example
 
-Aquí, lo que queremos establecer (el @q{lugar}) es la propiedad
-@code{'elements} de la expresión @code{result-event-chord}.
+Aquí, lo que queremos establecer (el @q{place}) es la propiedad
+@code{'articulations} de la expresión @code{note-event}.
 
 @example
 
 @example
-(ly:music-property result-event-chord 'elements)
+(ly:music-property note-event 'articulations)
 @end example
 
 @end example
 
-@code{ly:music-property} es la función que se usa para acceder a las
-propiedades musicales (los @code{'elements}, @code{'duration},
-@code{'pitch}, etc, que vimos en la salida de @code{\displayMusic}
-anterior).  El nuevo valor es la antigua propiedad @code{'elements},
-con un elemento adicional: la expresión @code{ArticulationEvent}, que
-copiamos a partir de la salida de @code{\displayMusic},
+@code{ly:music-property} es la función ustilizada para acceder a las
+propiedades musicales (las @code{'articulations}, @code{'duration},
+@code{'pitch}, etc, que vemos arriba en la salida de
+@code{\displayMusic}).  El nuevo valor es la antigua propiedad
+@code{'articulations}, con un elemento adicional: la expresión
+@code{ArticulationEvent}, que copiamos a partir de la salida de
+@code{\displayMusic},
 
 @example
 (cons (make-music 'ArticulationEvent
 
 @example
 (cons (make-music 'ArticulationEvent
-        'articulation-type "marcato")
-      (ly:music-property result-event-chord 'elements))
+        'articulation-type "accent")
+      (ly:music-property result-event-chord 'articulations))
 @end example
 
 @end example
 
-@code{cons} se usa para añadir un elemento a una lista sin modificar
-la lista original.  Esto es lo que queremos: la misma lista que antes,
-más la expresión @code{ArticulationEvent} nueva.  El orden dentro de
-la propiedad @code{'elements} no es importante aquí.
+Se usa @code{cons} para añadir un elemento a la parte delantera de
+una lista sin modificar la lista original.  Esto es lo que
+queremos: la misma lista de antes, más la nueva expresión
+@code{ArticulationEvent}.  El orden dentro de la propiedad
+@code{'articulations} no tiene importancia aquí.
 
 
-Finalmente, una vez hemos añadido la articulación marcato a su
-propiedad @code{elements}, podemos devolver @code{result-event-chord},
-de ahí la última línea de la función.
+Finalmente, una vez hemos añadido la articulación de acento a su
+propiedad @code{articulations}, podemos devolver
+@code{note-event}, de aquí la última línea de la función.
 
 
-Ahora transformamos la función @code{add-marcato} en una función
-musical:
+Ahora transformamos la función @code{add-accent} en una función
+musical (es cuestión de un poco de aderezo sintáctico y una
+declaración del tipo de su argumento).
 
 @example
 
 @example
-addMarcato = #(define-music-function (parser location event-chord)
+addAccent = #(define-music-function (note-event)
                                      (ly:music?)
                                      (ly:music?)
-    "Add a marcato ArticulationEvent to the elements of `event-chord',
-    which is supposed to be an EventChord expression."
-    (let ((result-event-chord (ly:music-deep-copy event-chord)))
-      (set! (ly:music-property result-event-chord 'elements)
-            (cons (make-music 'ArticulationEvent
-                    'articulation-type "marcato")
-                  (ly:music-property result-event-chord 'elements)))
-      result-event-chord))
+  "Add an accent ArticulationEvent to the articulations of `note-event',
+  which is supposed to be a NoteEvent expression."
+  (set! (ly:music-property note-event 'articulations)
+        (cons (make-music 'ArticulationEvent
+                'articulation-type "accent")
+              (ly:music-property note-event 'articulations)))
+  note-event)
 @end example
 
 @end example
 
-Podemos verificar que esta función musical funciona correctamente:
+A continuación verificamos que esta función musical funciona
+correctamente:
 
 @example
 
 @example
-\displayMusic \addMarcato c4
+\displayMusic \addAccent c4
 @end example
 
 
 @end example
 
 
-
-
-
-
 @ignore
 @menu
 * Trucos con Scheme::
 @ignore
 @menu
 * Trucos con Scheme::
@@ -1397,11 +1708,12 @@ Podemos verificar que esta función musical funciona correctamente:
 
 @c @nod e Trucos con Scheme
 @c @sectio n Trucos con Scheme
 
 @c @nod e Trucos con Scheme
 @c @sectio n Trucos con Scheme
-@translationof Tweaking with Scheme
+@c @transl ationof Tweaking with Scheme
 
 Hemos visto cómo la salida de LilyPond se puede modificar
 
 Hemos visto cómo la salida de LilyPond se puede modificar
-profundamente usando instrucciones como @code{\override TextScript
-#'extra-offset = ( 1 . -1)}.  Pero tenemos incluso mucho más poder si
+profundamente usando instrucciones como
+@code{\override TextScript.extra-offset = ( 1 . -1)}.
+Pero tenemos incluso mucho más poder si
 utilizamos Scheme.  Para ver una explicación completa de esto,
 consulte el @ref{Tutorial de Scheme}, y @ruser{Interfaces para programadores}.
 
 utilizamos Scheme.  Para ver una explicación completa de esto,
 consulte el @ref{Tutorial de Scheme}, y @ruser{Interfaces para programadores}.
 
@@ -1415,13 +1727,13 @@ TODO Find a simple example
 
 @ignore
 @lilypond[quote,verbatim,ragged-right]
 
 @ignore
 @lilypond[quote,verbatim,ragged-right]
-padText = #(define-music-function (parser location padding) (number?)
+padText = #(define-music-function (padding) (number?)
 #{
 #{
-  \once \override TextScript #'padding = #$padding
+  \once \override TextScript.padding = #padding
 #})
 
 #})
 
-\relative c''' {
-  c4^"piu mosso" b a b
+\relative {
+  c'''4^"piu mosso" b a b
   \padText #1.8
   c4^"piu mosso" d e f
   \padText #2.6
   \padText #1.8
   c4^"piu mosso" d e f
   \padText #2.6
@@ -1438,17 +1750,17 @@ Lo podemos usar para crear instrucciones nuevas:
 
 
 @lilypond[quote,verbatim,ragged-right]
 
 
 @lilypond[quote,verbatim,ragged-right]
-tempoPadded = #(define-music-function (parser location padding tempotext)
-  (number? string?)
+tempoPadded = #(define-music-function (padding tempotext)
+  (number? markup?)
 #{
 #{
-  \once \override Score.MetronomeMark #'padding = $padding
-  \tempo \markup { \bold $tempotext }
+  \once \override Score.MetronomeMark.padding = #padding
+  \tempo \markup { \bold #tempotext }
 #})
 
 #})
 
-\relative c'' {
+\relative {
   \tempo \markup { "Low tempo" }
   \tempo \markup { "Low tempo" }
-  c4 d e f g1
-  \tempoPadded #4.0 #"High tempo"
+  c''4 d e f g1
+  \tempoPadded #4.0 "High tempo"
   g4 f e d c1
 }
 @end lilypond
   g4 f e d c1
 }
 @end lilypond
@@ -1457,9 +1769,9 @@ tempoPadded = #(define-music-function (parser location padding tempotext)
 Incluso se le pueden pasar expresiones musicales:
 
 @lilypond[quote,verbatim,ragged-right]
 Incluso se le pueden pasar expresiones musicales:
 
 @lilypond[quote,verbatim,ragged-right]
-pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
+pattern = #(define-music-function (x y) (ly:music? ly:music?)
 #{
 #{
-  $x e8 a b $y b a e
+  #x e8 a b #y b a e
 #})
 
 \relative c''{
 #})
 
 \relative c''{