**Intro: Representando y procesando datos en Pharo** ****
# Tipos basicos: representando datos
## Números -> Hablemos de objetos básicos. 1, 2, 100, 2/3... son **Números**, y responden a multitud de mensajes evaluando expresiones matemáticas:
*Los números son objetos básicos que representan valores numéricos. Se mencionan ejemplos como cálculo factorial y fracciones.*
## Caracteres
-> En Pharo (y en Smalltalk en general), un objeto Character representa un carácter individual del alfabeto o un símbolo. Puedes crear una instancia de Character utilizando el operador $ seguido del carácter que deseas representar. Por ejemplo:
-> Puedes obtener el valor numérico ASCII de un carácter utilizando el mensaje charCode. Por ejemplo: Esto devolverá el número 64, que es el valor ASCII de '@'.
->Nota aparte: El valor ASCII (American Standard Code for Information Interchange) es un código numérico que representa caracteres de texto. El código ASCII estándar original comprendía 128 caracteres, cada uno de los cuales se representaba con un número del 0 al 127. Estos incluyen: -Letras mayúsculas (A-Z): 65-90 -Letras minúsculas (a-z): 97-122 -Dígitos (0-9): 48-57 -Símbolos y signos de puntuación: 33-47, 58-64, 91-96, 123-126 -Caracteres de control (no imprimibles): 0-31, 127
## Cadenas
*Colección de caracteres.* ->Una cadena es una colección de caracteres. Se crean utilizando comillas simples. Por ejemplo: 'a' es una cadena con un solo carácter, mientras que 'PharoTutorial' es una cadena de varios caracteres.
-> El size de una cadena es la cantidad de caracteres que contiene.
-> La concatenación de cadenas se realiza con la coma ;Por ejemplo: 'Pharo tutorial ', ' is cool' crea una nueva cadena concatenando las dos cadenas originales.
*
## Símbolos -> Un símbolo es una cadena inmutable y única globalmente. Esto significa que si creas dos símbolos con el mismo contenido, en realidad se trata del mismo objeto en memoria.
-> Puedes crear un símbolo a partir de una cadena usando asSymbol. Por ejemplo: 'PharoTutorial' asSymbol crea un nuevo símbolo #PharoTutorial.
-> También puedes convertir un símbolo a una cadena usando asString. Por ejemplo: #PharoTutorial asString devuelve la cadena 'PharoTutorial'.
-> El código muestra ejemplos de comparaciones entre cadenas y símbolos: = compara el contenido de los objetos. == compara si los objetos son exactamente el mismo (comparación de identidad).
## Arreglos *Los arreglos son una forma de almacenar colecciones de diversos objetos en Pharo (Smalltalk). Existen dos tipos principales: arreglos estáticos y arreglos dinámicos.*
##Arreglos Dinámicos -> Los arreglos estáticos son aquellos donde los valores de todos los objetos que los conforman se conocen en el momento en que se define el arreglo. Se crean utilizando #(...) y los elementos se separan por espacios.
**crea un arreglo dinámico con dos elementos, donde el primero es el resultado de (2+3) y el segundo es el resultado de (6*6)**
-> crea un arreglo dinámico con cuatro elementos, dos de ellos son cálculos y los otros dos son cadenas.
## Arrelos Estáticos -> Los arreglos dinámicos se crean durante el tiempo de ejecución, lo que significa que pueden contener cálculos que se evaluarán en tiempo de ejecución para determinar su valor. Se crean utilizando {...} y los elementos se separan por .
*crea un arreglo estático con tres elementos numéricos.*
*crea un arreglo estático que contiene otro arreglo estático anidado.*
# Mensajes: procesando datos
* Existen tres tipos de mensajes: unary (unarios), binary (binary) y keyword.*
## Binario -> Los mensajes binarios son aquellos que toman un argumento adicional después del receptor. Tienen la forma anObject aMessage anotherObject.
-> 3 + 2 envía el mensaje + con el argumento 2 al objeto 3, devolviendo el resultado de la suma (5).
-> Date today + 3 weeks envía el mensaje + con el argumento 3 weeks al objeto Date today, devolviendo una nueva fecha que es tres semanas después de la fecha actual.
-> 10 @ 100 envía el mensaje @ con el argumento 100 al objeto 10, creando un objeto Point con coordenadas (10, 100).
## Unario -> Los mensajes unarios son aquellos que se envían a un objeto sin argumentos adicionales. Tienen la forma anObject aMessage. Tiene la forma de: 1 objeto 1 mensaje
-> envía el mensaje class al objeto 1 (un número), lo que devuelve la clase a la que pertenece (SmallInteger).
-> b class envía el mensaje class al símbolo #b, devolviendo la clase Symbol.
-> true not envía el mensaje not al booleano true, negando su valor y devolviendo false
-> Time now envía el mensaje now a la clase Time, devolviendo la hora actual
-> Float pi envía el mensaje pi a la clase Float, devolviendo el valor aproximado de pi
## KeyWord -> Los mensajes de palabra clave son aquellos que toman uno o más argumentos, cada uno precedido por una palabra clave. Tienen la forma anObject akey: anotherObject akey2: anotherObject2.
-> 4 between: 0 and: 10 envía el mensaje between:and: con los argumentos 0 y 10 al objeto 4, devolviendo true porque 4 está entre 0 y 10.
-> 1 max: 3 envía el mensaje max: con el argumento 3 al objeto 1, devolviendo el valor máximo entre 1 y 3, que es 3.
-> Color r: 1 g: 0 b: 0 envía el mensaje r:g:b: con los argumentos 1, 0 y 0 a la clase Color, creando un objeto de color rojo.
Otra maera de expresar el color:
## Prioridad *Los mensajes unarios son ejecutados primero, los mensajes binarios son ejecutados después y finalmente las cadenas de mensajes: * **paréntesis > Unary > Binary > Keywords.** ###Ejemplos:
*La expresión `2 negated` cambia el signo de 2 a -2. Luego, `(3 raisedTo: 2)` eleva 3 a la potencia de 2, resultando en 9. Por lo tanto, el resultado total es -2 + 9 = 7.*
*Pharo aplica reglas de precedencia de operadores, realizando la suma de izquierda a derecha. La expresión se interpreta como (2 + 3) + 4. Primero se suman 2 y 3, resultando en 5, luego se suma 4 al resultado, dando un total de 9.*
*El resultado es 32, ya que 2 elevado a la potencia de 5 es 32*
*Es 32, ya que 2 elevado a la potencia de 5 es 32...*
* Retorna −1/3, el inverso multiplicativo del valor absoluto de −3.*
## Cambiando la prioridad de los mensajes *Los paréntesis se pueden usar para cambiar el orden de evaluación:*
###Ejemplos:
-> primero evalúa (2 + 3), y luego envía el mensaje squared al resultado.
*Primero se realiza la potenciación dentro de los paréntesis, obteniendo 8, luego se suma 2, resultando en 10*
*Define la ubicación del punto inferior derecho de un objeto en un plano bidimensional.*
##Prioridad con relacion a los mensajes matemáticos *Pharo no sigue las reglas tradicionales de las matemáticas. Los mensajes se siguen en un orden predefinido de izquierda a derecha.*
*Primero se realiza la multiplicación dentro de los paréntesis: y luego el resto de la operacion. *
*En las matemáticas, primero se evaluaria la division. Aqui, es de izquierda a derecha*
*Mientras que en este ejercicio si lo resolveriamos empezando por la division, greacias al parentesis*.
## Mensajes en Cascada
-> Los mensajes en cascada permiten enviar una secuencia de mensajes al mismo objeto receptor usando el operador ; Por ejemplo:
Esto es equivalente a:
##Bloques -> Los bloques son fragmentos de código que pueden ser ejecutados posteriormente. Se definen entre corchetes [ ] y pueden tomar argumentos precedidos por :.
->define un bloque que toma un argumento x y lo incrementa en 2.
-> define un bloque que toma un argumento x y lo incrementa en 2.
##Asignación de Bloques
*Los bloques pueden asignarse a variables y ejecutarse posteriormente utilizando el mensaje value.*
##Condicionales ->Los condicionales se implementan enviando mensajes a objetos booleanos (true o false). Por ejemplo:
-> Aquí, 1 < 2 evalúa a true, por lo que se ejecuta el bloque ifTrue:.
##Ciclos e Iteradores -> Los ciclos e iteradores en Pharo se implementan como métodos sobre colecciones. Por ejemplo:
-> crea una colección de números del 1 al 10.
itera del 1 al 20 en pasos de 3.
##Colecciones -> Las colecciones son objetos que contienen otros objetos. Hay varios mensajes útiles para trabajar con ellas:
-> evalúa un bloque para cada elemento de la colección.
-> crea una nueva colección aplicando un bloque a cada elemento.
-> crea una nueva colección con los elementos que satisfacen una condición.
-> crea una nueva colección con los elementos que no satisfacen una condición.
-> imprime los elementos separados por un elemento separador.
-> encuentra el primer elemento que satisface una condición.