**Intro a Pharo modificado**
## Notas de Danna Mateus
# Introducción:
Información en migración y en Spanglish: Este es un documento en migración, que retoma información del 2016, escrita originalmente como libreta interactiva en Grafoscopio y se está adecuando a nuevas tecnologías de Lepiter, surgida hasta 2021. En ese sentido, intenta recuperar y migrar información de los contextos originales en los que fue concebida, aprovechando los nuevos desarrollos tecnológicos, al tiempo que da cuenta de aquellas visiones y preocupaciones que no están reflejadas en esos nuevos entornos, pero que sí estaban en los originales. Por ejemplo: la preocupación por una mirada crítica a los datos y el código y la formación de capacidades al respecto, de modo que el código sea más un lenguaje común en lugar de un bien exclusivo a los desarrolladores de software y a sus preocupaciones. Un código que refleje sujetos y mundos más plurales. Por ello, en la medida en que da cuenta de los orígenes históricos y sus transiciones, también irá adaptándose a esto nuevos contextos. Mientras tanto, se notarán algunos elementos en Spanglish, pues el documento original estaba concebido para varios talleres internacionales, pero ahora se usa en clases y procesos de facilitación principalmente en el pregrado de Ciencias de la Información, Bibliotecología y Archivística, así como en los talleres recurrentes mixtos, que ocurren en remoto y en el hackerspace HackBo, de la comunidad de Grafoscopio. Próximas visitas a este documento deberían dar cuenta de su evolución. Te agradecemos de antemano por participar de esta transición en tu rol de lector(a)/explorador(a), por tu papel proactivo y tu paciencia al respecto.
# 1 Interacción Básica
> ¿con que fin se hizo esta herramienta ? >
## 2 Inspeccionando y Haciendo
Intenta ALT-i (or CMD-i or CTRL-i) en las siguientes expresiones:
> ¿ como se utiliza esto?Pruebe ALT-i (o CMD-i o CTRL-i) podria hacer un ejemplo >
> ¿son números aleatorios ? >
## Imprimiendo
Hablemos de impresión. Es un Do It que imprime el resultado junto a la expresión que has seleccionado. Por ejemplo, seleccione el texto a continuación, abra el menú y haga clic en 'imprimirlo (p)':
¿Has visto la letra 'p' entre paréntesis junto a 'imprimirlo'? Indica el acceso directo ALT- (o CMD- o CTRL-) para ejecutar este comando. Pruebe ALT-p (o CMD-p o CTRL-p) en las siguientes expresiones:
¿COMO APLICAR ESTA FUNCIÓN?
tres maneras de pensar la ejecución de manejar el codigo * impresion muestreme el resultado con una cadena de texto contl p es para imprimir se coloca un codigo *ejecución ejecute el resultado pero no me muestre nada *inspección
Envia un pharo y una fecha
etsa función arroja la hora
El resultado está seleccionado, por lo que puedes borrarlo usando la tecla de retroceso.
#3. Tipos Básicos: representando datos
Los tipos básicos son formas de representar información dentro de este sistema. Ver nodos en el interior para más detalles.
## 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:
Hace la división y da el resultado
## Caracteres
Un caracter represetan una letra o glifo del alfabeto y puede ser creado o instanciado usando el operador $
se representa con la letra A o $ llas letras representan variables son las cajas como las llamamos con el $ distingo que es un caracter,
* $a class sale falso por que no los estoy separando * 'pharo tutorial'
Puedes encontrar cuál es el número ASCII de un carácter.
arroja un numero (64) es como si fuera un codigo
Hay algunos caracteres que no son imprimibles.
Puedes imprimir todos los 256 caracteres del código extendido ASCII
¿Que significa Character allByteCharacters? y cual es su función para que casos se utiliza?
muestra todos los caracteres incluso los que no son imprimibles , nos da unos glifos , es un tipo de caracyer signo euro una secuencia de todos los caracteres se usa para conocer todos los signos de caracteres que se puede usar en una ipresion los recuadros con una x por dentro quiere decir qque ese caracter corresponde a una fuente tipografica que no esta instalada aún
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
Muestra las cajas ordenadas
No entiendo bien que hace esta función
Aparece la frase o mensaje al reves
Puedes acceder a cada caracter de una cadena usando el mensaje at:
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)
¿cual es la diferencia entre assymbol y asstring?
tres tipos de "igualdad" * asignación algo := 'otra cosa' en la variable algo estoy guardando otra cosa
comparación * 'algo' = 'otra cosa' dos variables u objetos tienen los mismos valores
ejemplo de comparación
el resultado es que el mensaje es igual al otro mensaje siendo verdadero
los simbolos sirven para abordar el problema de la homonímia
no se a que se refiere estas funciones ya que en algunas aparece verdadero y en otras falso pero no se diferenciar para que tipo serviria cada una
## 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
Inspecciona las siguientes expresiones:
los numeros se tomaron individuales pero todo lo que esta en el parentesis se toma como una caja
los estaticos inician con numeral
este envia a una pagina de error
debo define el arreglo luego se convierte en una coleccion ordenada y de ultimas se modifica
## 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 específico de lo que en ellos se guarda. y Están confinados por llaves { } y sus elementos se separan con el caracter ".". Inspecciona la siguiente expresión para definir un arreglo dinámico
Comparemos este arreglo estático
guardo calculos que el valor no es del todo conocido la coma concatena (une)
con este arreglo dinámico:
diferencia entre dinamico aqui se manejan llaves y puntos en los estaticos esta el numeral y espacios
No entiendo de donde salio el 5
cuando hay un size es la cantidada de cajas de ahi sale el 5 hay cinco cajas
lo mismo pasa por que el resultado es tres¿ de donde o como arroja ese resultado ?
## Collecciones e iteradores
Una colección es un arreglo o secuencia de datos (ordenados o no y repetidos o no). Un itereador es un elemento que recorre cada uno de los elementos de la colección. Hagamos un ejemplo previo para entender las colecciones. Una colección que duplica los primeros 20 números:
Esta función es para contar de dos en dos hasta 20 multiplicado por dos
En la parte interna del bloque estoy usando un iterador, que he llamado each y está antes de la barra (|) y una instrucción each * 2, que está después de la barra.
Esta cuenta de dos en dos y se le suma tres
Cuando usamos el mensaje #collect: lo que hacemos es que realizamos una operación en todos los elementos de la colección, como vimos en los ejemplos previos. Sin embargo, cuando usamos #select: lo que hacemos es creamos una nueva subcolección, cuyos elementos son aquellos que satisfacen una condición, es decir, que al aplicarles un proposición, dicha propición es verdadera.
De un modo similar, el mensaje #reject: rechaza todos los elementos en los que la condición sea verdadera. Por ejemplo:
# 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.
## Unario
Los mensajes unarios tienen la forma siguiente. anObject aMessage Tu ya has enviado mensajes unarios. Inspecciona los siguientes mensajes unarios:
## 4.2 Binario
Los mensajes binarios tienen la forma siguiente: anObjecto aMessage anotherObject Puedes inspeccionar los siguientes son mensajes binarios:
## Keyword
Los mensajes 'keyword' son mensajes con argumentos. Tienen la siguiente forma: anObject akey: anotherObject akey2: anotherObject2 Inspecciona los siguientes mensajes keyword: 4 between: 0 and: 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
para que se utilizan esas funciones , no es claro ver esos datos que aroja
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
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
### 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.
hace la operacion matemática
## Mensajes en cascada
Supongamos que tenemos un objeto donde queremos mostrar un conjunto de resultados
Y enviamos esta secuencia de mensajes:
Completa el mensaje ejemplo "hola pharo"
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:
## Bloques
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 index 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: para ejecutrlo debe colocar value
aparecen todos los items index
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
lo mejor es poner hasta 4 argumentos por cuestion estilistica
## 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)
## Condicionales
Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)
Aquí el mensajes es ifTrue:ifFalse Prueba esto:
Identifica que el tres es menor que 10
## 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.
### Colecciones
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
# 5. Opciones avanzadas
Las siguientes lecciones son algo más avanzadas y referidas 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:
abre una nueva ventana se debe explicar un poco mas a que sirve y para que se utiliza
Haz click sobre el botón para ir a la siguiente lección:
## 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:
Creemos un nuevo método para ir a la siguiente lección:
## Limpiando métodos
Antes de ir más allá, removamos este método:
## 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: