**Intro a Pharo**
**Presentado por Katherin Padilla Moncada **
Unidades Semánticas
**Tipos Básicos** : representando datos
Los tipos básicos son formas de reestablecer información dentro de este sistema. Consulte los nodos en el interior para obtener más detalles
3.1 Números
Ahora ya sabes cómo ejecutar el código Pharo. Ahora hablemos de los objetos básicos.
1, 2, 100, 2/3 ... son números, y responden a muchos mensajes que evalúan expresiones matemáticas. Inspeccione estos:

En la guía introductoria a Pharo, exploramos el concepto de números y su aplicación, Además de ofrecer una explicación detallada sobre estos conceptos fundamentales, la guía proporciona una serie de ejercicios diseñados para poner a prueba nuestra comprensión y habilidades en expresiones matemáticas. Estos ejercicios son una oportunidad para nuestro conocimiento y adquirir destreza en el uso de Pharo.
3.2 Caracteres
Un caracter represetan una letra del alfabeto y puede ser usado el operador ($)

Puedes encontrar cuál es el número ASCII de un carácter

En esta tabla podemos Guiarnos de los Caracteres correspondientes para la ejecucion de la misma

En este contexto podemos entender que al ejecutar el comando **($@ charCode) ** tenemos el caracter $@ que en la tabla de codigo ASCII nos indica que equivale a el numero 64.
Hay algunos caracteres que no se pueden imprimir, no se pueden visualizar al ser inspeccionados pero si podemos leer que el caracter a sido ejecutado.


Puedes imprimir todos los 256 caracteres del código extendido ASCII

Si ves gliberish es porque hay algún problema de visualización con símbolos no romanos/latinos, generalmente causado por las fuentes que tienes instaladas en tu Sistema Operativo y la interacción de la con un sistema Pharo/GT
3.3 Cadenas
Un String o cadena es una colección de caracteres. Usa comillas simples para crear un objeto String.

La concatenación de cadenas (strings) es el proceso de unir dos o más cadenas para formar una sola cadena más larga y se realiza utilizando el operador coma

3. 4 Símbolos
Un símbolo (Symbol) es una cadena (String) única globalmente.
Hay uno y solo un símbolo #PharoTutorial. Pueden existir varios objetos de tipo cadena (String) cuyo contenido sea 'PharoTutorial'
(Message=retorna 'true' si los dos objetos son IGUALES)
Para Smalltalk es:
x := 3 ← Aginación.
2 = 3 ← Comparación.
a == a ← Comparación fuerte. Se trata del mismo símbolo?
El operador = se utiliza para comparar dos objetos por igualdad La expresión 2 = 3 evalúa si el número 2 es igual al número 3, lo cual es falso


la comparación fuerte, Smalltalk utiliza == para verificar si dos objetos son el mismo objeto en memoria. La expresión a == a evaluará verdadero si y solo si a hace referencia al mismo objeto en memoria en ambos lados de la expresión

3.5 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.
Los arreglos estáticos, o simplemente arreglos, son aquellos en los que los valores de todos los objetos que los conforman son conocidos en el momento en que el arreglo se define (es decir, no contienen cálculos o variables, como los dinámicos que veremos más adelante).
Los arreglos están confinados por #( ) y sus elementos se separan por espacios.
Por ejemplo, inspecciona la siguiente expresión, que define un arreglo de 3 elementos

En la matriz principal, tenemos 3 elementos individuales: 1, 2, y 3.
Luego, tenemos una matriz con 3 elementos: 4, 5, y 6.
entonces La matriz principal contiene 3 elementos individuales, y una matriz con 3 elementos adicionales entonces el tamaño total de la matriz es 3 (elementos individuales) + 1 (matriz anidada) = 4 elementos en total.

La expresión #(1 2 4) representa una matriz que contiene los elementos 1, 2 y 4 el mensaje isEmpty
pregunta si la matriz está vacía o no, lo cual al ejecutarla sale FALSE, porque si contienen elementos

3.6 Arreglos Dinámicos
Los arreglos dinámicos son creados durante el tiempo de ejecución. Es decir, que podemos guardar en ellos cálculos, que luego se ejecutarán y determinarán el valor de lo que en ellos se guarda.
Están confinados por llaves { } y sus elementos se separan con el caracter "."

**Comparacion de arreglos**
arreglo estático
(2+3) es una expresión que suma 2 y 3, dando como resultado 5.
(6+6) es una expresión que suma 6 y 6, dando como resultado 12.
'hello' , 'Stef' es una concatenación de dos strings cadena, estas se unifican ando un resultando en un único string 'helloStef y se pone size
Entonces, #( (2+3) (6+6) 'hello' , 'Stef') size evalúa a 3

arreglo dinámico
(2+3) es una expresión que suma 2 y 3, dando como resultado 5.
(6+6) es una expresión que suma 6 y 6, dando como resultado 12.
'hello' , 'Stef' es una concatenación de dos strings cadena , se unifican y queda un resultado de un único string 'helloStef' y luego se evalua con size
Por lo tanto, { (2+3) . (6+6) . 'hello' , 'Stef' } size evalúa a 3

4 Mensajes: procesando datos
Los mensajes son la forma en que los objetos se comunican entre sí y en que nosotros, los humanos, nos comunicamos con el sistema de cómputo. Hay tres tipos de mensajes:
**unary (unarios), binary (binary) y keyword.**
4.1 Unario
Los mensajes unarios tienen la forma siguiente.
anObject aMessage
los mensajes unarios son aquellos que se envían a un objeto sin requerir ningún argumento adicional
false not evaluará a true. Esto se debe a que false es un valor bque representa "falso". Al aplicar el operador not, se invierte su valor lógico, convirtiéndolo en "verdadero". Entonces, true not resultará en false

El mensaje unario **not** se envía a un objeto que es** true**, el not invertirá el valor de **false** para que se convierta en true

Date today se utiliza para obtener la fecha actual del sistema. Esto devuelve un objeto de tipo Date que representa la fecha actual

4.2 Binario
los "mensajes binarios" son aquellos que se envían a un objeto junto con otro objeto, sin palabras clave o métodos especiales entre ellos. La forma típica de un mensaje binario es la siguiente
anObjecto aMessage anotherObject
Este mensaje binario + se utiliza para agregar un período de tiempo a una fecha. En este caso, se está agregando un período de 3 años a la fecha actual.

4.3 Keyword
son aquellos que se envían a un objeto junto con uno o más argumentos, donde cada argumento está asociado a una palabra clave específica. La forma típica de un mensaje de palabra clave es la siguiente
anObject akey: anotherObject akey2: anotherObject2
el mensaje r:g:b: es un ejemplo de un mensaje de palabra clave implementado en la clase Color. Este mensaje se utiliza para crear un color especificando los valores de los componentes rojo (r), verde (g) y azul (b)
la expresión Color r: 1 g: 0 b: 0, estamos creando un nuevo color donde el componente rojo (r) tiene un valor de 1 (máximo), mientras que los componentes verde (g) y azul (b) tienen un valor de 0 (mínimo), lo que resulta en un color rojo puro.

4.4 Prioridad
**Paréntesis:** Las expresiones dentro de paréntesis se evalúan primero.
**Mensajes unarios: ** Los mensajes unarios, que consisten en un solo identificador, se evalúan después de las expresiones entre paréntesis.
**Mensajes binarios:*** Los mensajes binarios, que consisten en operadores como +, -, *, etc., se evalúan después de los mensajes unarios.
**Mensajes de palabra clave: ** Los mensajes de palabra clave, que consisten en uno o más identificadores seguidos de dos puntos y un argumento, se evalúan después de los mensajes binarios
Evaluemos la expresión dentro de paréntesis: (3 + 2). Esto da como resultado 5.
Luego, elevamos 2 a la potencia (raisedTo) de 5. Esto significa que multiplicaremos 2 por sí mismo 5 veces.
Entonces, 2 potencia de 5 =(2×2×2×2×2)= 32

4.4.1 Cambiando la prioridad de los mensajes
Usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() y posteriormente la sentencia
"Squared" Elevado al cuadrado
la expresión dentro de los paréntesis: 2 + 3, que da como resultado 5
se aplica el mensaje squared al resultado de la suma, es decir, al número 5
(2 + 3) squared es a 25

4.4.2 Prioridad de los mensajes matemáticos
Las reglas tradicionales de las matematicas NO aplican dentro de Pharo
Aqui el mensaje multiplicación (*) 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

4.5 Mensajes en cascada
los "mensajes en cascada" permiten enviar múltiples mensajes a un mismo objeto de forma encadenada. Esto proporciona una forma concisa de realizar una secuencia de acciones en un objeto sin tener que repetir el nombre del objeto en cada línea de código
**messageBoard**, puedes encadenar los mensajes en cascada para lograr el mismo resultado de una manera más concisa y legible.
**show:** se utiliza para mostrar un mensaje en el objeto messageBoard Hola y Pharo
**cr** : se utiliza para agregar un salto de línea

manera abreviada
usamos el operador en cascada ";", que usado para enviar mensajes al mismo receptor.
Así, una vez limpiemos el Transcript anterior

aqui podemos ver que ya se implemento la manera abreviada.

4.6 Bloques
son como piezas de código encapsuladas que pueden ser ejecutadas en un momento posterior o bajo ciertas condiciones.
Este bloque toma un argumento x y devuelve el resultado de la expresión x + 2.

4.7 Asignación de bloques
En Pharo, los bloques son piezas de código encapsuladas que pueden ser asignadas a variables y ejecutadas en un momento
[:x | x+2] value: 20.
Este código crea un bloque directamente en el lugar donde se necesita y lo ejecuta inmediatamente con el argumento 20. El bloque toma x como argumento, suma 2 a x y devuelve el resultado. En este caso, se pasa 20 el resultado será 20 + 2 = 22
b := [:x | x+2].
b value: 20.
primero se crea un bloque y se asigna a la variable b. Luego, el bloque almacenado en b se ejecuta con el argumento 20. Este enfoque permite reutilizar el mismo bloque en múltiples lugares o en momentos diferentes dentro del código

4.8 Condicionales
Los condicionales son sólo menajes enviados a objetos


4.9 Ciclos e Iteradores
Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares
4.10 Colecciones
miColeccion := #(11 38 3 -2 10)
crea un array con los números (11 38 3 -2 10)
collect:
mensaje collect: para aplicar un bloque a cada elemento del array.
[:each | each abs]
El bloque proporcionado es [:each | each abs], que toma cada elemento (each)
