**Intro a Pharo**
# Tipos Básicos: representado datos Los tipos básicos son formas de representar información dentro de este sistema. Ver nodos en el interior para más detalles. **Anotación:** Estos tipo básicos son útiles para representar información ya sea por medio de números, caracteres, símbolos, entre otros. A continuación se presentan las distintas clases.
### Números Ahora sabes cómo ejecutar el código Pharo. 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:** Se deben poner correctamente los signos según la operación que se quiera ejecutar. Por ejemplo si se quiere dividir, multiplicar, sumar o incluso combinar se debera poner la operación como si fuera una calculadora. **Pregunta:** ¿Si coloca y ejecuta una operación mal hecha o con los signos erroneos el comando lanza la alerta de error?
## Caracteres Un caracter represetan una letra o glifo del alfabeto y puede ser instanciado usando el operador $
**Anotación:** si se ejecuta se podrá visualizar en grande la letra A.
Puedes encontrar cuál es el número ASCII de un carácter.
**Anotación:** si se ejecuta, arroja el número 64.
Hay algunos caracteres que no son imprimibles.
**Anotación:** Los caracteres que no son imprimibles como se muestra, al ejecutar la operación no arrojarán nada.
Puedes imprimir todos los 256 caracteres del código extendido ASCII
Si ve palabras sin sentido es debido a algún problema de visualización con símbolos no romanos/latinos, generalmente causado por las fuentes que ha instalado en su sistema operativo y la interacción con un sistema Pharo/GT.
## Cadenas Un String o cadena es una colección de caracteres. Usa comillas simples para crear un objeto String. Inspecciona estas expresiones
**Anotación:** se debe tener en cuenta que para algunos idiomas asiáticos no se puede ejecutar debido a los caracteres de los mismos.
**Anotación:** dependiendo de la palabra que se utiliza, mostrará el número de caracteres que componen dicha palabra. Por ejemplo, en este caso PharoTutorial tiene 13 caracteres y cuando se ejecuta el código lanza el númro 13.
**Anotación:** Muestra las palabras en reversa.
Puedes acceder a cada caracter usando el mensaje at:
**Anotación:** dependiendo de la posición del carcter, se debera poner el número en el que se encuentra. Por ejemplo, en este caso muestra la letra T que se encuentra en la posición 6.
La concatenación de String usa el operador coma:
## 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)
**Anotación:** se debe especificar si la palabra se quiere ejecutar como símbolo o como cadena.
**Nota:** En mátemáticas hay dos tipos de igualdad: * 𝑥=3 ← Aginación. A la variable 𝑥 , le estamos asignando el valor 3. * 2=3 ← Comparación: dados dos elementos conocidos decir si es o no el mismo. Para Smalltalk es: * x := 3 ← Aginación. * 2 = 3 ← Comparación. * a == a ← Comparación fuerte. Se trata del mismo símbolo?
**Anotación:** dependiendo de la operación se arrojará resultados TRUE o FALSE.
## 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
**Anotación:** muestra los valores en forma de lista. Muestra 3 items y todos en orden.
Inspecciona las siguientes expresiones:
**Anotación:** Se muestra el primer elemento con la operación first.
## 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 ".". Inspecciona la siguiente expresión para definir un arreglo dinámico
**Anotación:** muestra la operación por separado. En este caso 6 y 36.
Comparemos este arreglo estático
con este arreglo dinámico:
# 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.
## Unario Los mensajes unarios tienen la forma siguiente. anObject aMessage Tu ya has enviado mensajes unarios. Inspecciona los siguientes mensajes unarios:
**Anotación:** Muestra la hora exacta en la que se ejecuta el código. Asimismo, muestra los segundos y nanosegundos completos.
**Anotación:** Los códigos date son intersantes porque sirven para mostrarte la fecha dependiendo de qué día se ponga, en el sentido que se pueda poner la fecha actual, la pasada o la sigueinte. **Pregunta:** ¿Se puede preguntar la fecha exacta como por ejemplo fecha de la semana 15 del año?
## Binario Los mensajes binarios tienen la forma siguiente: anObjecto aMessage anotherObject Puedes inspeccionar los siguientes son mensajes binarios:
**Anotación:** Muestra la suma de la operación en este caso 5.
**Anotación:** El signo de asterisco se utiliza para realizar multiplicaciones.
**Anotación:** Se está comprobando si la suma 1+1 es correcta, en este caso muestra la afirmación por medio de TRUE.
**Anotación:** muestra la fecha en la que se quiere especificar. Por ejemplo, se suma la fecha de hoy añadiendole 3 semanas, lo cual daría 2024 - 04 - 02. Así como con las otras operaciones.
**Anotación:** Se muestra el resultado de afirmaciones FALSE o TRue, según la operación. En este caso sería una operación matemática de negativo o positivo.
**Anotación:** resultados según los símbolos de menor o mayor.
## Keyword Los mensajes 'keyword' son mensajes con argumentos. Tienen la siguiente forma: anObject akey: anotherObject akey2: anotherObject2 Inspecciona los siguientes mensajes keyword:
**Anotación:** se muestra que la afirmación es verdadera, en el sentido de que el número 4 está entre el 0 y el 10.
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
determina el valor máximo entre dos números.
El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir
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.
**Anotación:** en este caso, se puede indicar el color mediante los números y la posición de las letras. En el primer ejemplo, muestra el color rojo y en el segundo el color rosado.
## 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:** En el primer ejemplo "negated" es utilizado como símbolo - . Por el otro lado, "raisedTo " es utilizado como símbolo +.
Entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha
## 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
**Anotación:** Se resuelve primero la operación que está entre paréntesisy luego la setencia. Recordando que "squared" es el número al cuadrado, "raisedTo" para sumar.
## 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.
**Anotación:** En este caso primero se resolverá el mensaje de multiplicación enviado y luego se resolverá el seigueinte.
## Mensajes en cascada Supongamos que tenemos un objeto donde queremos mostrar un conjunto de resultados
Y enviamos esta secuencia de mensajes:
Enviar cada uno de los mensajes, refiriéndose individualmente al objeto receptor de los mismos es engorrosso. Para hacer lo mismo de manera abreviada usamos el operador en cascada ";", que usado para enviar mensajes al mismo receptor. Así, una vez limpiemos el Transcript anterior
podemos verificar que enviar cada uno de los mensajes anteriores es igual a:
**Anotación:** se ejecutan los mensajes de manera separada para que luego se realicen en forma de cascada.
## Bloques
Para esta parte se recomienda una comprensión básica de los tipos básicos. Si aún no ha hecho esa parte, vaya a ese subárbol y ejecute el código allí.
Ahora hablemos de los bloques. Piensa en los bloques como una manera de 'congelar' código que luego podremos ejecutar por demanda, cuando queramos y/o las condiciones para su ejecución se cumplan. Los bloques son métodos anónimos, lo cual quiere decir que no es necesario ponerles nombres para invocarlos (como ocurre con las operaciones sobre objetos que hemos visto hasta el momento) y pueden pueden ser almacenados en variables. Los bloques están delimitados por paréntesis cuadrados: []
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
Podemos tener además bloques que reciban varios argumentos, por ejemplo
**Anotación:** Los bloques son usados para congelar los códigos. No se necesita asignar nombres para que se puedan ejecutar.
## 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. Selecciona las siguientes tres líneas e imprimelas (Print it)
**Anotación:** Se muestra por separado la operación en forma de lita y luego en la segunda operación con Pharo se muestra el valor de B que vendría siendo 20.
## Condicionales Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)
Aquí el mensajes es ifTrue:ifFalse Prueba esto:
**Anotación:** Se muestra una lista de los números del 1 a 20 en orden. Con la GtTranscript abre una nota larga en la que se muestran diferentes códigos y textos.
## Ciclos e Iteradores Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares.
¿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:** Algunos resultados que se arrojan pueden ser en base a intervalos de números, diferentes colores y demás.
## Coleccciones 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)
Some other really nice iterators
**Anotación:** se muestran los elementos en forma de listas o como se dice colecciones de números. Se pueden añadir más criterios como each odd, each y el número.
# Opcional Las siguientes lecciones son algo más avanzados y referidos a elementos de interfaces gráficas (botones, morphs) y cambios en caliente en los métodos de Smalltalk. Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes pasar al cierre de este tutorial y luego ir a otros nodos como los de código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos proyectos del nodo titulado “Visualización”. de datos”.
## Ejemplos con botones Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase para crear una instancia de esta clase. El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:
Ahora creemos una nueva instancia de él
Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más
Juguemos con él:
Borrémosla y pidámosle al sistema limpiar la memoria:
Haz click sobre el botón para ir a la siguiente lección:
**Anotación:** Dependiendo de la operación que se asigne, se ejcutará un resultado diferente. Por ejemplo, se puede poner el operador de color poniendo el noombre del color a elegir para que se muestre.
## Cambiando un sistema vivo en ejecución Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. Mira el código fuente del método #ifFalse:ifTrue: de la clase True:
O sólo su comentario:
Acá están todos los métodos que implementa el ProfStef, base de este notebook:
**Anotación:** se muestra la lista con los items en orden.
Creemos un nuevo método para ir a la siguiente lección:
Wow! No puedo esperar a usar mi nuevo método!
## Limpiando métodos Tan chévere, ¿no? Antes de ir más allá, removamos este método:
**Anotación:** Son distintas operaciones que se pueden utilizar para limpiar los métodos, en algunos puede salir los operadores FALSE o TRUE, nil.
## Explorando objetos Pharo está lleno de objetos. Hay ventanas, texto, números, fechas, colores, puntos y mucho más. Puede interactuar con objetos de una manera mucho más directa que con otros lenguajes de programación. Cada objeto entiende el mensaje "explorar". Como resultado, obtienes una ventana del Explorador que muestra detalles sobre el objeto.
Esto muestra que el objeto de fecha consta de un momento (inicio) y una duración (un día).
Verás, la clase tiene muchos objetos. Echemos un vistazo a mi código:
**Anotación:** Se tienen diferentes elementos como números, textos, colores y demás. Con estos se pueden ejecutar códigos que permiten conocer más información y detalles del obeto.