**Intro a Pharo**
# Representando datos
Los tipos básicos de datos para formar o representar información dentro de este sistema. Por otra parte, representar datos en Pharo implica elegir la estructura de datos más adecuada para el problema que se esta resolviendo y luego manipular esos datos según sea necesario para lograr los objetivos esperados.
## Números
Ahora hablemos de objetos básicos. 1, 2, 100, 2/3... son Números, y responden a multitud de mensajes evaluando expresiones matemáticas. Inspeccione estos:
**Anotación:** Ejecuta el número dos
**Anotación:** El factorial es multiplicar todos los números enteros del 1 hasta llegar al número dado. Ejemplo: 1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19×20
**Anotación:** La siguiente expresión (1/3) representa una operación matemática que produce un valor numérico. En este caso, (1/3) es una división que resulta en un valor decimal o de punto flotante.
**Anotación:** Cuando se evalúa (1/3) en Pharo, el resultado de esta expresión es: 0.3333333333333333
**Anotación:** Se trata de la suma de dos fracciones: 1/3 y 4/5. Para resolverla, Pharo necesitas encontrar un denominador común. En este caso, el denominador común sería el mínimo común múltiplo (mcm) de 3 y 5, que es 15. Luego ajusta las fracciones para que tengan el mismo denominador, para finalmente obtener como resultado 17/15.
![ ](https://i.imgur.com/c645K71.png)
## Caracteres
Un caracter represetan una letra o glifo del alfabeto y puede ser instanciado usando el operador $
**Anotación:** Devuelve la letra A como caracter.
**Anotación:** Al ejecutar esta cadena de caracteres encuentra cual es el número ASCII (American Standard Code for Information Interchange) para un caracter específico. En este caso, devuelve el valor numérico Unicode del carácter @, que es 64. Asimismo, es un código de caracteres donde cada bit individual representa un carácter único a partir de 8 bit equivalente a 256 caracteres del código extendido ASCII.
**Anotación:** Existen caracteres, como los anteriores, que no arrojan código o son “no imprimibles”.
**Anotación:** El código anterior permite “imprimir” o ejecutar los 256 caracteres del código extendido ASCII. Sin embargo, se ejecutan palabras o caracteres sin sentido. Este error se da probablemente porque puede haber un problema de visualización de los símbolos latinos o romanos desde el sistema operativo.
## Cadenas
Colección de caracteres
**Anotación:** El resultado para esta cadena es: "This class represents the array of 8 bit wide characters".
**Anotación:** Representa un caracter asociado de Unicode. Problema: This is going to be a problem with the languages so called CJK (Chinese, Japanese, Korean. Or often CJKV including Vietnamese).
**Anotación:** Si se ejecuta 'PharoTutorial' aparece la palabra en sí misma representada en caracteres individuales. Ejemplo: $P $h $a $r $o , lo cual se une como una cadena y forma o representa la palabra. Si se agrega la palabra “size” arroja 13, que quiere decir el número de caracteres que contiene la palabra.
**Anotación:** Se ejecutan las letras en mayúscula.
**Anotación:** Devuelve la cadena de palabras en reversa.
**Anotación:** Devuelve la palabra en reversa. No obstante, notese que es un palíndromo: se lee igual al derecho y al revés.
**Anotación:** Devuelve la palabre “T”. Es decir, la sexta letra de la cadena de caracteres de la palabra.
**Anotación:** Lo anterior, permite concatenar/unir palabras.
## Símbolos
Un símbolo es una cadena, la cadena son varios objetos donde el contenido sea pharotutorial Las cadenas almacenan y manipulan textos.
**Anotación:** Se ejecuta la palabra “PharoTutorial” como un solo símbolo.
**Anotación:** Se ejecuta la palabra “PharoTutorial” como una cadena.
*En conclusión:* La diferencia entre estos dos símbolos radica en que, si bien la sintaxis que arroja cuando se ejecuta la etiqueta se visualiza de la misma manera, internamente el código diferencia la acción; es decir, si es una cadena o un simbolo.
![ ](https://i.imgur.com/KSitvTr.png)
Las anteriores cadenas dan como resultado "true" porque el simbolo único de "'PharoTutorial' es igual a 'PharoTutorial'. Es decir, significa que el valor asociado a la cadena de caracteres es idéntico al nombre de la etiqueta en sí. Esto podría ser útil en ciertos contextos de programación o manipulación de datos donde se necesite alguna forma de identificación uniforme o convención de nomenclatura. Sin embargo, en un sistema más elaborado, esto podría ser redundante ya que no aporta información adicional sobre la etiqueta.
![ ](https://i.imgur.com/iL4U3z1.png)
**Anotación:** La comparación entre #PharoTutorial == 'PharoTutorial' verifica si el símbolo #PharoTutorial es igual a la cadena de caracteres 'PharoTutorial'. Lo anterior, da como resultado "false" porque el símbolo único #PharoTutorial no es igual a la cadena 'PharoTutorial'. En conclusión, *los símbolos son una manera de desambiguar "homonimias" al proporcionar identificadores únicos y garantizar la unicidad de los identificadores en el código.*
## Arreglos
Los arreglos son maneras de guardar colecciones de información diversa. Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros.
### Arreglos estáticos
Son los valores de todos los objetos que no contienen variables. Se componen de #( ), sus elementos se encuentran separados por un espacio.
**Anotación:** Al ejecutar arroja el resultado 4. Lo que quiere decir que en el caracter número 4 inicia un arreglo dentro de la cadena.
**Anotación:** El #(1 2 4) es una forma de definir un arreglo literal, que contiene los elementos 1, 2 y 4. Por lo tanto, esta notación de arreglo se conoce como "Array literal".
![ ](https://i.imgur.com/jQJKFxo.png)
**Anotación:** Para este ejemplo, la expresión #(1 2 4) isEmpty se evaluará como "false", dado que, el arreglo contiene elementos, por lo tanto, no está vacío. Es decir, la función isEmpty se utiliza para verificar si un arreglo está vacío o no. En este caso, como el arreglo contiene elementos, la evaluación de isEmpty devolverá "false".
**Anotación:** Devuelve el número 1, porque es el primer número del arreglo.
**Anotación:** Conforme a lo anterior, es una expresión en Pharo que trabaja con un arreglo, que es una colección ordenada de elementos. En donde al descomponer este arreglo se puede observar lo siguiente.
**Anotación:** Lo anterior, crea un nuevo arreglo con dos elementos: 'hello' y 'World'.
**Anotación:** Esta parte del código toma el elemento en la posición 2 del arreglo (que es 'World') y lo reemplaza con 'Pharo'.
**Anotación:** Es una construcción común en Pharo que simplemente devuelve el objeto al que se le aplica el mensaje. En este caso, devuelve el arreglo modificado. Entonces, el resultado final de esta expresión sería un nuevo arreglo #('hello' 'Pharo'), donde 'World' ha sido reemplazado por 'Pharo'.
### Arreglos Dinámicos
Se pueden guardar cálculos. Al ejecutarlos determinan el valor guardado. Estos tipos de arreglo están confinados por llaves { } y sus elementos se separan con el caracter ".".
**Anotación:** Este arreglo dinámico se crea como una colección que contiene dos objetos o expresiones en donde:
**(2+3):** Esta expresión se evaluará primero. La suma de 2 y 3 es 5. Por lo tanto, este será el primer elemento del arreglo.
**(6*6):** De manera similar, esta expresión se evaluará a 36, que será el segundo elemento del arreglo.
Entonces, el arreglo resultante contendrá dos elementos: el número 5 y el número 36.
**Anotación:** El arreglo contiene cuatro elementos en total: 5, 12, "hello" y "Stef". Al parecer el tamaño del arreglo se obtiene con el mensaje "size", que devuelve la cantidad de elementos que contiene. Entonces, el tamaño del arreglo sería 4, dado que tiene cuatro elementos.
**Anotación:** Este arreglo es una colección que contiene tres elementos: el resultado de la suma de 2 más 3, el resultado de la suma de 6 más 6, y una concatenación de dos cadenas de caracteres ('hello' y 'Stef'). De acuerdo a lo identificado el tamaño de este arreglo se puede obtener utilizando el mensaje size.
# Mensajes: procesando datos
Comunicación de objetos entre si. Existen tres tipos de mensajes: unary (unarios), binary (binary) y keyword.
## Unario
Consiste en una sola palabra. Tiene la forma de: 1 objeto 1 mensaje anObject aMessage
**Anotación:** Al inspeccionar devuelve el siguiente resultado: My instances are 31-bit numbers or 63-bit numbers depending on the image architecture, stored in twos complement form. The allowable range is approximately +- 1 billion (31 bits), 1 quintillion (63 bits) (see SmallInteger minVal, maxVal).
**Resultado devuelto:** This class represents the symbols containing 8bit characters.
**Anotación:** Representa un cararter asociado al Unicode.
**Anotación:** De acuerdo a los dos mensaje ejecutados se interpreta que: El mensaje not en Pharo es un operador de negación booleana. Por lo tanto, devuelve true si el receptor es false, y false si el receptor es true.
**Anotación:** Devuelve la hora actual del sistema, incluyendo la hora, los minutos, los segundos y las milesimas de los segundos.
**Anotación:** Devuelve la fecha actual del sistema.
**Anotación:** Devuelve la fecha del día anterior.
**Anotación:** Devuelve la fecha del día después.
**Anotación:** Devuelve el valor de la constante matemática π (pi) representada como un número de punto flotante (float). Es decir, es la relación entre la longitud de una circunferencia y su diámetro en geometría euclidiana.
## Binario
Consisten en dos palabras. Tiene la forma de: 1 objeto 1 mensaje otro objeto
**Anotación:** Aqui Pharo esta realizando una operación aritmética de suma entre dos números enteros 3 y 2. El resultado de esta operación es 5. En este caso, Pharo evalúa la expresión y devuelve el resultado, que en este caso es un número entero.
**Anotación:*** El resultado de esta expresión es 625. Por lo tanto, el mensaje 25 * 25 en Pharo significa que el resultado de la multiplicación de 25 por 25 es 625.
**Anotación:** En Pharo es una afirmación y una operación matemática simple que indica que la suma de 1 más 1 es igual a 2. Por consigueinte es verdadero.
**Anotación:** Devuelve la fecha contando el día actual más tres semanas.
**Anotación:** Devuelve la fecha contando el día actual más tres años.
**Anotación:** Devuelve la fecha contando el día actual menos tres años.
**Anotación:** Devuelve "falso" ¿por qué es una expresión booleana que evalúa a "false" debido a que ninguno de los operandos es true?
**Anotación:** En esta expresión booleana se utiliza el | para evaluar si al menos una de las expresiones es verdadera o falsa. Por lo tanto, true | false resultaría en true, dado que al menos uno de los operandos (true) es verdadero.
**Anotación:** Considero que esta expresión no tiene sentido porque no se está utilizando en una expresión lógica completa, dado que devuelve el mismo valor "true".
**Anotación:** En este caso, false y true son valores booleanos, donde false representa la afirmación "falso" y true representa la afirmación "verdadero". En este caso específico, dado que uno de los operandos es true, el resultado de la operación será true.
**Anotación:** Aqui Pharo simplemente está realizando una operación lógica de "Y" entre dos valores booleanos verdaderos. El resultado de esta operación será true, dado que ambas expresiones son verdaderas.
**Anotación:** Pharo devuelve como resultado false, debido a que ambas expresiones booleanas no son verdaderas al mismo tiempo.
**Anotación:** En Pharo, @ es el operador de creación de instancias, la cual se utiliza para crear una nueva instancia de un objeto. En este caso específico, 10 @ 100 crea una nueva instancia de un objeto del tipo Point, que representa un punto en un plano cartesiano bidimensional. Por consiguiente, el número 10 representa la coordenada X del punto y el número 100 representa la coordenada Y del punto. Por lo tanto, 10 @ 100 crea un nuevo punto en el plano cartesiano con coordenadas (10, 100).
**Anotación:** Devuelve verdadero porque 10 es menor o igual que 12.
**Anotación:** Devuelve falso porque 10 no es mayor o igual que 12.
**Anotación:** Al parecer es una secuencia de dos mensajes de cadena que devuelve como resultado una línea de variables y otra de valores en formato númerico.
**Anotación:** Mediante esta expresión Pharo compara dos fechas para verificar si la fecha actual es menor que la fecha de ayer.
Consideró que en términos de lógica la comparación de fechas puede devolver un error, dado que si la fecha actual es menor que la fecha de ayer, esto significa que estamos en el pasado, lo que no tendría sentido lógico. Por lo tanto, consideró que en la mayoría de los casos, esta expresión daría como resultado false como devuelve en el presente ejercicio.
**Anotación:** En esta expresión Pharo verifica si la fecha actual es posterior a la fecha de ayer. Como resultado devuelve true.
## Keyword
Los mensajes 'keyword' son mensajes con argumentos. Tienen la siguiente forma: anObject akey: anotherObject akey2: anotherObject2 Asimismo, requieren uno o más argumentos y cuyo selector consiste en una o más palabras clave cada una terminada en dos puntos ( : ).
**Anotación:** “El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso” Pero con 3 sigue siendo true porque 4 está entre 0 y 10. Si se ejecuta con el número 5 sería false porque 4 sale del rango.
**Anotación:** Devuelve 3 porque es el valor máximo entre 1 y 3.
![ ](https://i.imgur.com/FRkUqEW.png)
**Anotación:** En Pharo se puede utilizar esta expresión para crear un nuevo objeto de color mediante la especificación de sus componentes rojo (r), verde (g) y azul (b) en el modelo RGB (rojo, verde, azul).
Entonces, en conjunto, este mensaje crea un color que es rojo puro, Dado que tiene el componente rojo máximo (1) y los componentes verde y azul mínimos (0).
**Note** que también se puede escribir en números:
**Anotación:** "Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás escribirlos como cociente, de forma que sean un número entre 0 y 1. Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener."
## Prioridad
“Los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords”.
**Anotación:** De acuerdo al ejercicio logre identificar que al parecer en Pharo el mensaje de prioridad unaria es interpretado mediante (negated) la cual se utiliza para cambiar el signo de un número. Por otro lado, raisedTo: es un mensaje binario que se utiliza para elevar un número a una potencia específica.
Para este caso el (3 raisedTo: 2) eleva el número 3 a la potencia de 2, lo que resulta en 9. Después de eso, el mensaje de prioridad unaria ( - ) cambia el signo del resultado, convirtiendo 9 en -9.
Entonces, el resultado de la expresión completa 2 negated + (3 raisedTo: 2) sería:
**A continuación continuo con los ejercicios del temario.**
**Anotación:** En Pharo, el mensaje + es un mensaje binario que se envía a un objeto para realizar una operación de suma con otro objeto. Por ende, cuando se escribe la anterior expresión, Pharo aplican reglas de precedencia de operadores, donde la suma se realiza de izquierda a derecha.
Sin embargo, en Pharo, al parecer los mensajes binarios (como +) tienen la misma prioridad, por lo que la expresión se interpreta como (2 + 3) + 4. En este caso, primero se suman 2 y 3, lo que resulta en 5, y luego se suma 4 al resultado, dando un total de 9.
**Anotación:** Al ejecutar este mensaje el resultado es 32, porque es la respuesta de 2 elevado a las 5.
**Anotación:** El resultado de la ejecución es: I represent an x,y pair of numbers usually designating a location on the screen. My instances are created either using the message @ or x:y: or r:degrees: as follows:
![ ](https://i.imgur.com/p2uYQYt.png)
**Anotación:** Esta expresión se utiliza comúnmente para definir un rectángulo en el plano 2D con una esquina en (0, 0) donde el primer número representa la coordenada en el eje x y el segundo número representa la coordenada en el eje y. Por otra parte, la esquina opuesta en (100, 200) representa las coordenadas del rectánculo.
**Anotación:** El mensaje corner: es un mensaje enviado a un objeto Point (punto) en Pharo. Este mensaje se utiliza para definir un rectángulo, donde el punto receptor se toma como la esquina superior izquierda del rectángulo y el argumento proporcionado es la esquina inferior derecha.
La evaluación de la expresión 0@0 corner: 100@200, da como resultado un Rectangle (Rectángulo) en este caso.
**Anotación:** Este mensaje en Pharo retorna -1/3, que es el inverso multiplicativo del valor absoluto de -3, negado.
### Cambiando la prioridad de los mensajes
"El uso de parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna( ) y posteriormente la sentencia".
**Anotación:** Primero resuelve los parentesís, es decir la suma de 2+3 es igual a 5 y luego ejeccuta la sentencia fuera del parentesís, o sea, al cuadrado. Por lo tanto el resultado es 25 porque es la respuesta de 5 al cuadrado.
**Anotación:** Al igual que el ejemplo anterior, primero ejecuta los parentesis: Así pues, 2 elevado a la 3 es 8 + 2, que es la sentencía externa: el resultado es 10.
![ ](https://i.imgur.com/tPdRd30.png)
**Anotación:** El mensaje bottomRight en el contexto de Pharo se utiliza para definir la ubicación del punto inferior derecho de un objeto en un plano bidimensional, como una ventana o un objeto gráfico.
**Anotación:** El mensaje 0@0 extent: 100@200 está creando un rectángulo en el plano bidimensional. 0@0 indica la coordenada del punto superior izquierdo del rectángulo (es decir, 0 en el eje X y 0 en el eje Y), y extent: 100@200 establece el ancho del rectángulo en 100 unidades y la altura en 200 unidades. Por lo tanto, al combinar ambos mensajes, se está creando un rectángulo en el plano con un punto superior izquierdo en (0,0) y un punto inferior derecho en (100,200). Esto define las dimensiones y la posición del rectángulo en el plano bidimensional.
### Prioridad de los mensajes matemáticos
**Anotación:** “Las reglas tradicionales de las matematicas NO aplican dentro de Pharo”. "Aqui el mensaje multiplicación (X) es enviado al 2, y su resultado correspondiente es 20. Entonces 20 reciben el mensaje +, con argumento 2, para un total de 22. Recuerda que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones".
**Anotación:** El resultado es 40 porque opera de izquierda a derecha, es decir: 2 + 2: 4 y luego 4×10:40
**Anotación:** El proceso para evaluar esta expresión sería el siguiente: Se realiza la multiplicación: 2 * 10 = 20. Luego, se suma el resultado de la multiplicación al número 2: 2 + 20= 22. Por lo tanto, el resultado del mensaje sería 22.
**Anotación:*** En este caso, primero se realiza la operación dentro de paréntesis, que es la multiplicación de 2 por 10, lo que da como resultado 20. Luego, se suma 2 al resultado de la multiplicación, obteniendo así 22. Por lo tanto, (2 * 10) + 2 equivale a 22.
**Anotación:** Aunque los resultados de los anteriores mensajes es 22 en ambos existe una diferencia entre (2 * 10) + 2 y 2 + (2 * 10) la cual radica en el orden de evaluación de las operaciones. En matemáticas, la multiplicación y la división se realizan antes que la suma y la resta, por lo que cualquier expresión dentro de paréntesis se evaluará primero antes de continuar con el resto de la expresión. Sin embargo, la suma y la resta se realizan de izquierda a derecha según el orden en que aparecen en la expresión. En este caso, ambas expresiones dan el mismo resultado, 22, debido a las propiedades de la aritmética.
**Anotación:** Esta expresión se evaluaría como una operación matemática. El resultado es la siguiente fracción que resuelve la operación: 8-5=3 3/2=1,5
**Anotación:** El resultado de esta operación es 22
**Anotación:** Al evaluar esta expresión matemática en Pharo resultará en 5.5 en donde la operación 5/2 da como resultado 2.5, y luego 8 - 2.5 es igual a 5.5. De igual manera, esta operación también se podría resolver así:
![ ](https://i.imgur.com/GSL3vZF.png)
## Mensajes en Cascada
Para este caso se debe usar el operador en cascada ( ; ), para enviar mensajes al mismo receptor.
Ahora bien, "supongamos que tenemos un objeto donde queremos mostrar un conjunto de resultados."
**Anotación:** Enviamos esta secuencia de mensajes:
**Anotación:** La anterior expresión está destinada a mostrar dos mensajes que probablemente se configuran así: **show:** 'hello';: Este mensaje indica al objeto messageBoard que muestre el texto "hello". **cr;:** Este mensaje es probablemente una abreviatura de "carriage return" (retorno de carro), que indica que el siguiente texto se mostrará en una nueva línea. **show:** 'Pharo'.: Este mensaje solicita al objeto messageBoard que muestre el siguiente texto "Pharo". En consecuencia, la ejecución de este mensaje mostraría "hello" y "Pharo" en dos líneas diferentes
## Bloques
Un bloque es básicamente una función anónima y son expresiones encerradas en corchetes.
El bloque anterior no abre el Zen de Pharo, porque el bloque, por omisión, no es ejecutado. Ahora ejecuta:
Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):
Los argumentos, son las variables internas de los bloques, están precedidas por ':' y la barra vertical "|" separa la parte en que se definen los argumentos, de la parte en que se dice que hacer con ellos.
Podemos ejecutar un bloque enviandole mensajes value
El resultado es 2.5
El resultado es 12
El resultado es −2
**Nota:** Al parecer un bloque se evalúa cuando. Aquí un ejemplo:
Los bloques pueden recibir parámetros, cada uno de los cuales se declara con dos puntos precediéndole. Una barra vertical separa la declaración de parámetros del cuerpo del bloque. Para evaluar un cuerpo con un parámetro, debes enviar el mensaje value: con un argumento. A un bloque de dos parámetros se le debe enviar value:value:, y así, hasta los 4 argumentos.
Tomado de: (Black et al., 2013)
## Asignación de Bloques
Los bloques pueden ser asignados a variables y ejecutados después. Nota que |b| es la declaración de una variable llamada 'b' y que ':=' asigna un valor a una variable.
**Anotación:** El resultado impreso sería: 22 Dado que en las tres líneas, se define un bloque que suma 2 al valor pasado como argumento y se aplica este bloque al valor 20. Por lo tanto, el resultado impreso es 22 en ambas ocasiones.
## Condicionales
*Los condicionales, se expresan generalmente a través del envío de mensajes a booleanos, números y colecciones, con bloques como argumentos.* Tomado de: (Black et al., 2013)
**Anotación:** Es la misma estructura que las fórmulas condicionales en Excel. Se expresa por ejemplo así: Si el número 3 es mayor que 10 entonces devuelve falso, pero si el número 3 es menor que 10 entonces devuelve verdadero. En este caso es: el enunciado 3 es mayor que 10, entonces: Si es verdadero devuelve que hay quizás hay un error Si es falso entonces devuelve No: 3 es menor que 10.
## Ciclos e Iteradores
Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares.
*“Las colecciones comprenden un gran número de clases diferentes, muchas de las cuales soportan el mismo protocolo. Los mensajes más importantes para iterar sobre las colecciones incluyen do:, collect:, select:, reject:, detect: and inject:into:."* Tomado de: (Black et al., 2013)
**Anotación:** Devuelve un intervalo de 1 hasta 10
**Anotación:** Lo anterior es un ejemplo de un ciclo o bucle, en donde Pharo realiza una única iteración de un ciclo que va de 1 a 1, multiplicando cada valor del ciclo por 2 y mostrando el resultado en el Transcript.
**Anotación:** El código imprime los números del 1 al 20 (con un paso de 3) en el panel de transcripción de Pharo, uno en cada línea. En este caso, devolvió los números 1, 4, 7, 10, 13, 16 y 19.
**Anotación:** Lo anterior, es un bucle que itera desde el número 30 hasta 0 con un paso de -2. Según (Black et al., 2013) en Pharo, este tipo de bucle se crea utilizando el método to:by:do:. En otras palabras, el presente código imprime los números del 30 al 0 en la ventana de Transcripción, con un paso de -2 entre cada número.
¿Qué hacer cuando necesito tanto el índice como el objeto? En ese caso usamos doWithIndex, que permite trabajar con los objetos y con su índice, es decir, tener bloques que reciben dos argumentos.
**Anotación:** Pharo utiliza ciclos e iteradores para recorrer una colección de colores (colors) y mostrar información sobre cada color en un objeto Transcript. En este caso, el código crea una colección de colores y luego itera sobre cada color, mostrando información sobre ellos en la ventana de Transcript, incluyendo su índice en la colección y su nombre.
![ ](https://i.imgur.com/EoVp1sA.png)
## Colecciones
**Anotación:** Las colecciones son estructuras de datos que permiten almacenar y manipular múltiples elementos de manera organizada. Las colecciones pueden ser de varios tipos, como arrays, listas, conjuntos, diccionarios, etc. Es decir, el mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), evaluando el bloque para cada elemento. Acá queremos imprimir todos los números sobre el Transcript (una consola)
**Anotación:** Al parecer el código toma la colección de números (11 38 3 -2 10) y calcula el doble de cada número y lo muestra en el Transcript, uno por línea formados mediante intervalos o columnas.
![ ](https://i.imgur.com/bgXzJ0k.png)
**Otros iteradores realmente buenos.**
**Anotación:** Este colección define un array literal, que es una forma de crear un array con elementos predefinidos. En este caso, el array contiene los números 11, 38, 3, -2 y 10.
**Anotación:** Según (Black et al., 2013) la expresión collect: es un mensaje enviado al array que realiza una transformación en cada elemento del array y devuelve una nueva colección con los resultados de esa transformación. En este caso, se está aplicando la función abs (valor absoluto) a cada elemento del array.
**Anotación:** La expresión completa devuelve una nueva colección con los booleanos correspondientes a si cada elemento es impar o no. En este caso, la salida sería #(true false true false false), ya que 11, 3 y -2 son impares, mientras que 38 y 10 son pares.
**Anotación:** Selecciona todos los elementos impares de la matriz. En este caso, devuelve una nueva matriz que contiene los elementos 11, y 3, dado que son los elementos impares de la matriz original.
**Anotación:** Devuelve una nueva colección que contiene solo los elementos que son mayores o iguales a 10 del Array original. En este caso, la nueva colección será #(11 38 10).
**Anotación:** Muestra una nueva matriz que contiene los elementos que no son mayores que 10. En este caso, la matriz resultante será #(3 -2 10).
**Anotación:** Lo anterior, representa una colección literal de números, seguido por un bucle do:separatedBy: que realiza una acción para cada elemento de la colección y separa la salida por un separador específico. Por lo tanto, al ejecutar este código se imprimirá cada número en la consola Transcript de esta manera 11-38-3 -2- 10 con un index adjunto.
**Anotación:** En Pharo este código busca el número 0 en la colección dada. Si lo encuentra, imprime "Encontrado" en la consola. Si no lo encuentra, devuelve nil. para este ejemplo aplica el "nil".
# Bibliografía consultada
*Black, A. P., Ducasse, S., Nierstrasz, Oscar., Pollet, Damien., Cassou, Damien., Denker, Marcus., & Open Textbook Library. (2013). Pharo by example. https://files.pharo.org/books-pdfs/pharo-by-example/2013-PharoByExample-2013-SP.pdf*