Estamos trabajando arduamente para mejorarlo.
Si desea colaborar, puede editarlo aquí: edit here (md).
Series
| sections in this chapter: |
|---|
| estructura-alternativa-de-mensaje |
XOScript conoce dos tipos de colecciones: series y listas. Las series son enumeraciones de objetos en un orden fijo. Las listas no tienen orden, sino que se parecen a una leyenda que incluye una clave (o término) y su valor correspondiente. Las series son comparables a las matrices o arreglos (PHP, Java, C) y las listas (Python). Las listas son comparables a las matrices asociativas o arreglos asociativos (PHP) o a los diccionarios (Python) en otros lenguajes de programación. Para crear una nueva serie, escriba:
>> fibonacci := Serie nuevo.
Esta secuencia vacía se puede rellenar con adjuntar:
fibonacci adjuntar: 0.
fibonacci adjuntar: 1.
fibonacci adjuntar: 1.
fibonacci adjuntar: 2.
fibonacci adjuntar: 3.
fibonacci adjuntar: 5.
fibonacci adjuntar: 8.
fibonacci adjuntar: 13.
Este resultado revela que también se puede utilizar esta notación más corta para declarar una serie:
>> fibonacci := Serie ← 0 ; 1 ; 1 ; 2 ; 3 ; 5 ; 8 ; 13.
Este programa muestra el mismo resultado. Por supuesto, esta notación es mucho más corta y, por lo tanto, mucho más cómoda
La flecha es un mensaje binario que crea una nueva serie y al mismo tiempo envía el objeto subsiguiente para que se incruste instantáneamente en esta nueva serie. Los puntos y coma (;) son todos mensajes binarios que colocan un valor en la serie. Para averiguar la cantidad de objetos de una serie, use contar
En lugar de utilizar el punto y coma, se puede utilizar un símbolo de viñeta para añadir algo a la serie. De esta manera, la lista se parece bastante a una de texto normal:
>> platos := Serie nuevo
~ ['Achicoria']
~ ['Coles de Bruselas']
~ ['Chucrut'].
Las series responden a mensajes como: adjuntar: , mínimo , máximo , cada: , anteponer: , unirse: , posición: , primero , último, penúltimo, poner:en: , toma-el-último , toma-el-primero , contar , desde:longitud: , reemplazar:longitud:con:: , por: , copiar , ordenar: , llenar:con: , y encontrar: Otra forma de crear una serie es transformar una palabra en una serie de caracteres dividir (es decir, dividir) un texto en una serie de palabras:
Salida escribir: (['abc'] caracteres), detener.
Salida escribir: (
['Chicory,Brussels sprouts,Sauerkraut']
dividir: [',']
), detener.
Por ejemplo, si el mensaje caracteres se envía a un texto, la respuesta será una serie que contiene todos los caracteres separados de los que está hecho el texto. Cuando el mensaje dividir: se envía a un texto con otro texto como argumento, el pequeño fragmento de texto adjunto se utiliza para desglosar el texto recibido.
El texto en fragmentos de texto separados. La respuesta será una serie de estos objetos de texto. A su vez, también es posible convertir una serie en un texto enviando el mensaje unirse: , vea el siguiente ejemplo:
>> platos := Serie ←
['Achicoria'] ;
['Coles de Bruselas'] ;
['Chucrut'].
Salida escribir: (platos unirse: [' ~or~ ']), detener.
En este caso, el fragmento de texto adjunto se utiliza para unir los textos de la serie. Cada objeto dentro de una serie tiene su propio lugar, que se denomina posición. El primer objeto obtiene la posición 1, el segundo la posición 2, y así sucesivamente. Al utilizar el mensaje posición: (o la versión más corta ? ) es posible recuperar el elemento en la posición especificada:
Salida escribir: (platos posición: 3), detener.
Salida escribir: platos ? 1.
Salida escribir: platos ? 9.
En caso de que no haya nada en la posición solicitada, la respuesta será un objeto Nulo. Hay tres posiciones especiales en una serie, que son sus valores: el primero, el último y el penúltimo elemento. Los objetos en esas posiciones se pueden recuperar utilizando los mensajes respectivos.
>> abc := ['ABC'] caracteres.
Salida escribir: abc primero, detener.
Salida escribir: abc último, detener.
Salida escribir: abc penúltimo, detener.
Para reemplazar un objeto en una posición específica dentro de la secuencia misma, escriba: poner:en:
abc poner: ['2nd'] en: 2.
De manera similar, se puede eliminar un objeto de la serie utilizando el símbolo menos:
>> x := Secuencia ← 1 ; 2; 3.
Salida escribir: x, stop.
Salida escribir: x - 2.
Con el mensaje anteponer: es posible insertar un objeto al inicio de la serie:
>> x := Serie ← ['Nut'] ; ['Monkey'].
x anteponer: ['Apple pie'].
Salida escribir: x.
También es posible generar una serie rellenando una serie vacía con el mensaje llenar:con: En caso de que se prefiera rellenar de antemano con ceros las puntuaciones máximas de un juego de ordenador, escribir:
>> puntuaciones := Serie nuevo llenar: 10 con: 0.
Salida escribir: puntuaciones, detener.
También es posible copiar una serie:
>>copia := puntuaciones copiar.
Es posible quitar objetos de la serie cortando su inicio y final:
>> palabras := Serie ← ['Tarta de manzana'] ; ['Nuez'] ; ['Mono'].
>> original := palabras copiar.
>> a := palabras toma-el-primero.
>> b := palabras toma-el-último.
Salida escribir: original, detener.
Salida escribir: a, detener.
Salida escribir: b, detener.
Salida escribir: palabras, detener.
En el ejemplo anterior, al utilizar el mensaje toma-el-primero , se elimina el objeto inicial de la serie, que se coloca en consecuencia en a. Además, se elimina el último objeto utilizando el mensaje toma-el-último, que se coloca en b. Como resultado, es el objeto Texto del medio, “Nut”, el cual permanece. La copia original también se muestra, demostrando así la función de copia. El mensaje encontrar: permite encontrar información dentro de una serie:
>> pinturas := Serie nuevo
~ ['Fighting Temeraire']
~ ['Lady of Shalott']
~ ['Hay Wain'].
Salida escribir: ( pinturas encontrar: ['Hay Wain']), detener.
Salida escribir: ( pinturas encontrar: ['Lady of Shalott']), detener.
Salida escribir: ( pinturas encontrar: ['Sunflowers']), detener.
Al utilizar el mensaje cada:, es posible aplicar una tarea a cada elemento de una serie:
>> metros := Serie ← 1200 ; 4000 ; 6210.
metros cada: { :numero :metros
Salida escribir: metros / 0.3048 , detener.
}.
El ejemplo que se muestra arriba muestra una conversión de metros a pies. La tarea de conversión se aplica a cada elemento individual de la serie. En el primer parámetro ( :numero ), la tarea recibe la posición del elemento que se va a manipular. En el segundo parámetro ( :metros ), la tarea recibe el objeto que se coloca en la posición mencionada anteriormente. Siéntase libre de nombrar los parámetros usted mismo, sin embargo, el orden dentro de la tarea es fijo. El primer parámetro es siempre el número de posición y el segundo es el objeto. Si se requiere el número más bajo, se puede enviar el mensaje mínimo. De hecho, si se requiere el número más alto dentro de la serie, se envía el mensaje máximo.La siguiente ilustración muestra una serie de puntajes de un juego. Se crea una nueva serie con dos elementos que contienen los extremos de los puntajes:
>> puntajes := Secuencia ← 100 ; 50 ; 200 ; 350.
>> extremos := Secuencia ← puntajes mínimo ; puntajes máximo.
Salida escribir: extremos, detener
Esto da como resultado:
En una serie es posible ejecutar un reemplazo utilizando el mensaje reemplazar:longitud:con Por lo tanto, se puede utilizar para reemplazar un fragmento de serie por otra serie:
>> x := Serie ← 1 ; 2 ; 3 ; 4 ; 5.
>> z := Serie ← 9.
>> y := x reemplazar: 2 longitud: 1 con: z.
Salida escribir: y, detener.
La ordenación es una acción útil que se aplica con frecuencia a las series. Dado que solo se ordenan las series, esta acción es única para este tipo de colección. Una serie se puede ordenar enviando el mensaje ordenar: a un objeto Serie, junto con un argumento que contiene una tarea de ordenación que incluye dos parámetros:
>> continentes := Serie nuevo
~ ['Oceania']
~ ['America']
~ ['Asia']
~ ['Europe']
~ ['Africa']
~ ['Antartica']
~ ['Australia'].
continentes ordenar: { :a :b <- a > b. }.
Salida escribir: continentes, detener.
La ordenación de mensajes: obtendrá de forma constante dos objetos de una serie y, en consecuencia, solicitará que la tarea compare los dos. La tarea de ordenación debe responder cada ronda con Verdadero o Falso.
En el fragmento ilustrado, los continentes se ordenan en orden alfabético comparando cada par de palabras con el mensaje >. Para ordenar en orden inverso, aplique el mensaje <.
Estructura alternativa de mensaje
Supongamos que tiene una serie:
>> x := Serie ← 1 ; 2 ; 3.
Si desea eliminar el primer y el último elemento, su mensaje sería:
x toma-el-primero toma-el-último.
Desafortunadamente, la notación anterior no funcionará correctamente. El mensaje toma-el-primero devuelve el primer elemento de la serie, que, a su vez, se convertirá en el receptor del mensaje toma-el-último. Por lo tanto, el mensaje toma-el-último no se envía a x, sino a 2. Una posible solución a este problema sería crear dos setencias separadas, como:
x toma-el-primero
x toma-el-último
Sin embargo, esto es poco práctico, en particular cuando necesita eliminar más de dos elementos. Por lo tanto, XOScript ofrece una estructura de mensaje alternativa para este tipo de situaciones. En las estructuras de mensajes alternativas, las respuestas de los objetos se ignoran y obtendrá el objeto receptor como respuesta, una y otra vez. Una estructura de mensaje alternativa se inicia enviando el mensaje hacer a un objeto y la estructura de mensaje alternativa puede finalizar enviando el mensaje hecho. En el ejemplo ilustrado, esto podría aplicarse de la siguiente manera:
>> x := Serie ← 1 ; 2 ; 3.
x hacer toma-el-primero toma-el-último hecho.
Salida escribir: x, detener.
Tenga en cuenta que para evitar sorpresas desagradables, siempre cierre con echo. Vea lo que sucede en el próximo ejemplo:
>> x := Serie ← 1 ; 2.
x hacer toma-el-primero.
Salida escribir: x, detener.
El código anterior generará el mensaje de error: Debe responder con texto. La razón de esto es que el mensaje de escribir: desea crear un texto de x; por lo tanto, envía internamente el texto del mensaje. Como regla, se devuelve un objeto de texto como respuesta, sin embargo, como la estructura de mensaje alternativa aún está activa, se devuelve la serie en sí. Esto hace que el procesamiento posterior falle y XOScript mostrará un mensaje de error.