]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/es/extending/scheme-tutorial.itely
Doc: cleanup @file{}, take 2: remove all @/ escaping sequences.
[lilypond.git] / Documentation / es / extending / scheme-tutorial.itely
index 35cd3c98390b34d14c1b7b3e6f21910499f991b9..42642987f9ee125291c2a0758799b78a4e371f32 100644 (file)
@@ -1,14 +1,14 @@
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
 
 @ignore
 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
 
 @ignore
-    Translation of GIT committish: 6af1d076865b903c39c6c240d337d3d7719b0ce4
+    Translation of GIT committish: 10bd5cc93870ac4b884b8cb938cfc6a19c768097
 
     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.13.36"
 
 @node Tutorial de Scheme
 @appendix Tutorial de Scheme
 
 @node Tutorial de Scheme
 @appendix Tutorial de Scheme
@@ -213,7 +213,7 @@ 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.
 
 más usados en la programación de LilyPond se encuentran las parejas,
 las listas, las listas-A y las tablas de hash.
 
-@unnumberedsubsubsec Parejas
+@subheading Parejas
 
 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
 
 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
@@ -271,7 +271,7 @@ véase
 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
 
 
 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}
 
 
-@unnumberedsubsubsec Listas
+@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
 
 Una estructura de datos muy común en Scheme es la @emph{lista}.
 Formalmente, una lista se define como la lista vacía (representada
@@ -302,7 +302,7 @@ 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.
 
 @q{List Processing} (proceso de listas).  Todas las expresiones de
 Scheme son listas.
 
-@unnumberedsubsubsec Listas asociativas (listas-A)
+@subheading Listas asociativas (listas-A)
 
 Un tipo especial de listas son las @emph{listas asociativas} o
 @emph{listas-A}.  Se puede usar una lista-A para almacenar datos para
 
 Un tipo especial de listas son las @emph{listas asociativas} o
 @emph{listas-A}.  Se puede usar una lista-A para almacenar datos para
@@ -328,7 +328,7 @@ guile>
 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.
 
-@unnumberedsubsubsec Tablas de hash
+@subheading Tablas de hash
 
 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
 
 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
@@ -505,7 +505,7 @@ 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.
 
 devuelven un valor resultante de su ejecución.  También pueden
 manipular variables definidas fuera del procedimiento.
 
-@unnumberedsubsubsec Definir procedimientos
+@subheading Definir procedimientos
 
 Los procedimientos se definen en Scheme con @code{define}:
 
 
 Los procedimientos se definen en Scheme con @code{define}:
 
@@ -531,7 +531,7 @@ guile> (media 3 12)
 15/2
 @end lisp
 
 15/2
 @end lisp
 
-@unnumberedsubsubsec Predicados
+@subheading Predicados
 
 Los procedimientos de Scheme que devuelven valores booleanos se suelen
 llamar @emph{predicados}.  Por convenio (pero no por necesidad),
 
 Los procedimientos de Scheme que devuelven valores booleanos se suelen
 llamar @emph{predicados}.  Por convenio (pero no por necesidad),
@@ -545,7 +545,12 @@ guile> (menor-que-diez? 15)
 #f
 @end lisp
 
 #f
 @end lisp
 
-@unnumberedsubsubsec Valores de retorno
+@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.
 
 A veces, el usuario quiere tener varias expresiones de Scheme dentro
 de un procedimiento.  Existen dos formas en que se pueden combinar
 
 A veces, el usuario quiere tener varias expresiones de Scheme dentro
 de un procedimiento.  Existen dos formas en que se pueden combinar
@@ -575,7 +580,7 @@ guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
 @subsection Condicionales de Scheme
 @translationof Scheme conditionals
 
 @subsection Condicionales de Scheme
 @translationof Scheme conditionals
 
-@unnumberedsubsubsec if
+@subheading if
 
 Scheme tiene un procedimiento @code{if}:
 
 
 Scheme tiene un procedimiento @code{if}:
 
@@ -596,7 +601,7 @@ 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
 
-@unnumberedsubsubsec cond
+@subheading cond
 
 Otro procedimiento condicional en scheme es @code{cond}:
 
 
 Otro procedimiento condicional en scheme es @code{cond}:
 
@@ -635,22 +640,29 @@ guile> (cond ((< a b) "a es menor que b")
 @subsection Sintaxis del Scheme de LilyPond
 @translationof LilyPond Scheme syntax
 
 @subsection Sintaxis del Scheme de LilyPond
 @translationof LilyPond Scheme syntax
 
-En un archivo de música, los fragmentos de código de Scheme se
-escriben con el signo de almohadilla @code{#}.  Así, los ejemplos
-anteriores traducidos a LilyPond son:
+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
+de entrada de LilyPond:
 
 @example
 
 @example
-##t ##f
-#1 #-1.5
-#"esto es una cadena"
-#"esto
-es
-una cadena"
+#(define (average a b c) (/ (+ a b c) 3))
 @end example
 
 Observe que los comentarios de LilyPond (@code{%} y @code{%@{ %@}}) no
 @end example
 
 Observe que los comentarios de LilyPond (@code{%} y @code{%@{ %@}}) no
-se pueden utilizar dentro del código de Scheme.  Los comentarios en
-el Scheme de Guile se introducen como sigue:
+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:
 
 @example
 ; esto es un comentario de una línea
 
 @example
 ; esto es un comentario de una línea
@@ -662,9 +674,13 @@ el Scheme de Guile se introducen como sigue:
 !#
 @end example
 
 !#
 @end example
 
-Se pueden combinar en un mismo archivo de música varias expresiones de
-Scheme consecutivas mediante la utilización del operador @code{begin}.
-Ello permite que el número de marcas de cuadradillo se reduzca a una.
+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.
+
+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
@@ -672,38 +688,35 @@ Ello permite que el número de marcas de cuadradillo se reduzca a una.
   (define menganito 1))
 @end example
 
   (define menganito 1))
 @end example
 
-Si el @code{#} va seguido de un paréntesis de apertura, @code{(}, como
-en el ejemplo anterior, el analizador sintáctico permanece dentro del
-modo de Scheme hasta que encuentra el paréntesis de cierre
-correspondiente, @code{)}, por lo que no son necesarios más símbolos
-de @code{#} para introducir una sección de Scheme.
-
-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{#} en todas partes.
 
 @node Variables de LilyPond
 @subsection Variables de LilyPond
 @translationof LilyPond variables
 
 
 @node Variables de LilyPond
 @subsection Variables de LilyPond
 @translationof LilyPond variables
 
-@c TODO -- make this read right
-
-Algo similar ocurre con las variables.  Después de definir una
-variable,
+Las variables de LilyPond se almacenan internamente en la forma de
+variables de Scheme.  Así,
 
 @example
 doce = 12
 @end example
 
 @noindent
 
 @example
 doce = 12
 @end example
 
 @noindent
-las variables se pueden usar también dentro de expresiones, aquí
+equivale a
+
+@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
 
 @example
 veintiCuatro = (* 2 doce)
 @end example
 
 @noindent
 
 @example
 veintiCuatro = (* 2 doce)
 @end example
 
 @noindent
-el número 24 se almacena dentro de la variable @code{veintiCuatro}.
+lo que daría lugar a que el número 24 se almacenase dentro de la
+variable @code{veintiCuatro} de LilyPond (y de Scheme).
 
 @node Variables de entrada y Scheme
 @subsection Variables de entrada y Scheme
 
 @node Variables de entrada y Scheme
 @subsection Variables de entrada y Scheme
@@ -727,6 +740,7 @@ independiente de la @code{\traLaLa} externa.
 traLaLa = @{ c'4 d'4 @}
 \layout @{ traLaLa = 1.0 @}
 @end example
 traLaLa = @{ c'4 d'4 @}
 \layout @{ traLaLa = 1.0 @}
 @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
 @c
 En efecto, cada archivo de entrada constituye un ámbito, y cada bloque
 @code{\header}, @code{\midi} y @code{\layout} son ámbitos anidados
@@ -734,20 +748,20 @@ 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
 
 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
+Scheme.  Una asignación de la forma:
 
 @example
 traLaLa = @{ c'4 d'4 @}
 @end example
 
 @noindent
 
 @example
 traLaLa = @{ c'4 d'4 @}
 @end example
 
 @noindent
-se convierte internamente en una definición de Scheme
+se convierte internamente en una definición de Scheme:
 
 @example
 (define traLaLa @var{Valor Scheme de `@code{... }'})
 @end example
 
 
 @example
 (define traLaLa @var{Valor Scheme de `@code{... }'})
 @end example
 
-Esto significa que las variables de entrada y las variables de Scheme
+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
 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
@@ -806,32 +820,35 @@ No es posible mezclar variables de Scheme y de LilyPond con la opción
 @code{--safe}.
 
 
 @code{--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
 
-Esta sintaxis se usará con mucha frecuencia, pues muchos de los trucos
-de presentación consisten en asignar valores (de Scheme) a variables
-internas, por ejemplo
+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:
 
 @example
 \override Stem #'thickness = #2.6
 @end example
 
 
 @example
 \override Stem #'thickness = #2.6
 @end example
 
-Esta instrucción ajusta el aspecto de las plicas.  El valor @code{2.6}
-se pone dentro de la variable @code{thickness} 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.
+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.
 
 @cindex propiedades frente a variables
 @cindex variables frente a propiedades
 
 @cindex propiedades frente a variables
 @cindex variables frente a propiedades
@@ -844,45 +861,79 @@ variable.
 @subsection Variables de LilyPond compuestas
 @translationof LilyPond compound variables
 
 @subsection Variables de LilyPond compuestas
 @translationof LilyPond compound variables
 
-@unnumberedsubsubsec Desplazamientos
+@subheading Desplazamientos
 
 
-Los desplazamientos bidimensionales (coordenadas X e Y) así como los
-tamaños de los objetos (intervalos con un punto izquierdo y otro
-derecho) se introducen como @code{parejas}.  Una pareja@footnote{En la
-terminología de Scheme, la pareja se llama @code{cons}, y sus dos
-elementos se llaman @code{car} y @code{cdr} respectivamente.}  se
-introduce como @code{(primero . segundo)} y, como los símbolos, se deben
-preceder de un apóstrofo:
+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.
 
 @example
 \override TextScript #'extra-offset = #'(1 . 2)
 @end example
 
 
 @example
 \override TextScript #'extra-offset = #'(1 . 2)
 @end example
 
-Esto asigna la pareja (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.
+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.
+
+Los procedimientos para trabajar con desplazamientos están en
+@file{scm/lily-library.scm}.
 
 
-@unnumberedsubsubsec Dimensiones
+@subheading Dimensiones
 
 
-HACER @c todo -- write something about 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.
 
 
-@unnumberedsubsubsec Listas-A de propiedades
+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.
 
 
-HACER @c todo -- write something about property alists
+@subheading Listas-A de propiedades
 
 
-@unnumberedsubsubsec Cadenas de listas-A
+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.
 
 
-HACER @c todo -- write something about alist chains
+Las propiedades de LilyPond son símbolos de Scheme, como por ejemplo
+@code{'thickness}.
+
+@subheading Cadenas de listas-A
+
+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,
+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.
 
 @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.
+
 Cuando se analiza una expresión musical, se convierte en un conjunto
 de objetos musicales de Scheme.  La propiedad definitoria de un objeto
 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 es un número racional que
-mide la longitud de una pieza de música en redondas.
+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
 
 Un objeto musical tiene tres clases de tipos:
 @itemize
@@ -1017,6 +1068,10 @@ cualquier información adicional (en este caso, un evento
 @subsection Propiedades musicales
 @translationof Music properties
 
 @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.
+
 El objeto @code{NoteEvent} es el primer objeto de la propiedad
 @code{'elements} de @code{someNote}.
 
 El objeto @code{NoteEvent} es el primer objeto de la propiedad
 @code{'elements} de @code{someNote}.
 
@@ -1141,7 +1196,7 @@ Ahora examinamos la entrada,
 
 Así pues, en nuestra función, tenemos que clonar esta expresión (de
 forma que tengamos dos notas para construir la secuencia), añadir
 
 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
+@code{SlurEvent} a la propiedad @code{'elements} de cada una de
 ellas, y por último hacer una secuencia @code{SequentialMusic} con los
 dos @code{EventChords}.
 
 ellas, y por último hacer una secuencia @code{SequentialMusic} con los
 dos @code{EventChords}.
 
@@ -1340,8 +1395,8 @@ Podemos verificar que esta función musical funciona correctamente:
 * Trucos con Scheme::
 @end menu
 
 * Trucos con Scheme::
 @end menu
 
-@node Trucos con Scheme
-@c @section Trucos con Scheme
+@c @nod e Trucos con Scheme
+@c @sectio n Trucos con Scheme
 @translationof Tweaking with Scheme
 
 Hemos visto cómo la salida de LilyPond se puede modificar
 @translationof Tweaking with Scheme
 
 Hemos visto cómo la salida de LilyPond se puede modificar