X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=Documentation%2Fes%2Fextending%2Fscheme-tutorial.itely;h=42642987f9ee125291c2a0758799b78a4e371f32;hb=7ba0a22641cb0c7f5949d66a06d1e2e1fd0b3033;hp=35cd3c98390b34d14c1b7b3e6f21910499f991b9;hpb=e5e41320cc1370a4a94785f1accaadb7ce42b8fc;p=lilypond.git diff --git a/Documentation/es/extending/scheme-tutorial.itely b/Documentation/es/extending/scheme-tutorial.itely index 35cd3c9839..42642987f9 100644 --- a/Documentation/es/extending/scheme-tutorial.itely +++ b/Documentation/es/extending/scheme-tutorial.itely @@ -1,14 +1,14 @@ @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 -@c \version "2.12.0" +@c \version "2.13.36" @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. -@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 @@ -271,7 +271,7 @@ véase @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 @@ -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. -@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 @@ -328,7 +328,7 @@ guile> 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 @@ -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. -@unnumberedsubsubsec Definir procedimientos +@subheading Definir procedimientos Los procedimientos se definen en Scheme con @code{define}: @@ -531,7 +531,7 @@ guile> (media 3 12) 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), @@ -545,7 +545,12 @@ guile> (menor-que-diez? 15) #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 @@ -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 -@unnumberedsubsubsec if +@subheading 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 -@unnumberedsubsubsec cond +@subheading 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 -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 -##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 -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 @@ -662,9 +674,13 @@ el Scheme de Guile se introducen como sigue: !# @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 @@ -672,38 +688,35 @@ Ello permite que el número de marcas de cuadradillo se reduzca a una. (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 -@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 -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 -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 @@ -727,6 +740,7 @@ independiente de la @code{\traLaLa} externa. 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 @@ -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 -Scheme. Una asignación de la forma +Scheme. Una asignación de la forma: @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 -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 @@ -806,32 +820,35 @@ No es posible mezclar variables de Scheme y de LilyPond con la opción @code{--safe}. - - @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 -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 @@ -844,45 +861,79 @@ variable. @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 -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 +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 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 @@ -1017,6 +1068,10 @@ cualquier información adicional (en este caso, un evento @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}. @@ -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 -@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}. @@ -1340,8 +1395,8 @@ Podemos verificar que esta función musical funciona correctamente: * 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