En esta sesión, Estudiaremos la composición del mensaje.
Veremos cómo funciona la precedencia: la jerarquía de elementos
La pregunta que debe hacerse es:
"¿Qué sucede cuando se tiene una secuencia de mensajes unarios?"
Escribí la siguiente expresión:
1000 factorial class name ¿Qué pasa?
Lo ejecuta como si hubiera escrito todos estos paréntesis.
Puede ver que son molestos.
Cuando tiene mensajes al mismo nivel
unario, binario o palabras clave funciona con los tres,
los evalúa de izquierda a derecha.
Envío el mensaje factorial a 1000.
Luego envío el mensaje class al resultado de factorial.
Luego envío el mensaje name
a este nuevo objeto
Devuelve LargePositiveInteger.
Factorial 1000 es un número muy grande.
También puede probar con factorial 10000.
Es un poco mas largo
Hay mensajes con paréntesis
cuando necesitan ser ejecutados primero.
Entonces tienes mensajes únicos, luego binario, luego palabras clave.
Cuando en el mismo nivel, vas de izquierda a derecha.
Tomemos un ejemplo.
Tengo un mensaje unario, squared,
y un mensaje binario, +.
El mensaje unario gana.
Primero, envío squared.
A continuación, envío el mensaje +.
Devuelve 11. Está bien.
Esta es otra situación.
Voy a elevar a la potencia usando raisedTo:
Tengo un mensaje binario y una palabra clave. El mensaje binario gana.
Primero, tengo 5.
Entonces ejecuto raisedTo: regresa 32. Es correcto.
Este es un ejemplo más complicado.
Los colores en Pharo son objetos.
Tengo la clase Color.
Tengo tres mensajes unarios: gris, blanco y negro.
Tengo dos mensajes binarios: = y -.
¿Qué pasa entonces? El sistema primero ejecuta todos los mensajes únicos.
Devuelve el color aGray, el color a blanco, y el color a negro.
Ahora tengo que enviar mensajes.
Tengo que elegir entre el mensaje - y el mensaje =.
Envío el mensaje - al objeto aGray con blanco como argumento.
Devuelve el color aBlack.
Comparo los dos colores. Obtengo aBlack = aBlack, lo cual es cierto.
Este es un ejemplo para mostrarle que
también puede hacer una conversión automática. con Pharo
Es una especie de broma.
Tengo la expresion 1 class maxVal + 1
Tengo dos mensajes unarios, clase y maxVal,
y un mensaje binario.
¿Cómo se ejecuta esta expresión?
Envío el mensaje class al SmallInteger 1.
Devuelve SmallInteger ya que 1 es un entero. Funciona.
Como es el resultado de 1 class, envío el mensaje maxVal.
¿Cuál es el mensaje maxVal?
Significa:"¿Cuál es el número más grande que se puede codificar en un SmallInteger?"
Obtengo esta gran cantidad que termina con 23.
A este número, envío el mensaje + 1.
No devuelve un SmallInteger.
ya que este es el valor que puede ser representado por un pequeño entero.
Como resultado, no puede ser un SmallInteger.
Quiero saber cual es la clase de este numero
Escribo paréntesis y envío clase. Devuelve LargePositiveInteger.
Este es el más grande de los SmallInteger.
Y eso es lo más pequeño de los LargePositiveInteger.
Escribí paréntesis
porque sin ellos, La clase se hubiera enviado a 1.
No quiero eso. Quiero enviar class al resultado.
Imagina que he creado un rectángulo.
Quiero obtener el punto en la parte inferior derecha del rectángulo.
Yo escribí esto. Se cuelga cuando lo ejecuto.
El sistema no comprende: 100 no entiende bottomRight
¿Por qué? Porque bottomRight es un mensaje unario.
Se ejecuta antes que los demás: se envía a 100, su receptor.
100 no puede entender esta API dado que pertenece a la clase rectángulo.
Tengo que escribir paréntesis como lo hice en esta expresión.
¿Como funciona? Lo que hay entre paréntesis se ejecuta primero.
Dentro, tengo dos mensajes binarios que se ejecutan.
Crean puntos: dos de ellos se crean.
Envío extent: a un punto que crea un rectángulo.
Tengo un punto 0 @ 0.
Le paso extent: 100@100.
Devuelve este rectángulo.
Lo pregunto por el valor bottomRight.
Obtengo un rectángulo
Devuelve el valor del punto aquí:
es 100@100
Le dije que las cosas eran muy simples en Pharo.
Solo hay mensajes.
+ es un mensaje como cualquier otro. No hay orden de precedencia.
Lo bueno es que puedes usar + para lenguajes de diminio específicos.
Puedes usar + entre objetos no relacionado con objetos matemáticos.
No puedes hacerlo en Java. Puedes hacerlo en C ++ al redefinir los operadores.
En Pharo, la solución
fue decidir + sería como cualquier otro mensaje
El énfasis se puso en la simplicidad.
Hay un precio a pagar: no hay precedencia matemática.
Veamos esto con un ejemplo.
En esta expresion, hay dos operadores:
dos mensajes binarios
Ejecuto de izquierda a derecha.
Obtengo 5 y devuelve 50: No es lo que aprendí en la escuela.
Para desambiguar esto, tengo que reescribir esto usando paréntesis
alrededor de *
Tienes que tener cuidado cuando usando operaciones aritméticas en Pharo
ya que los operadores matemáticos son solo mensajes
Otro ejemplo:
si escribo 1/3 + 2/3, No obtengo el resultado correcto
como el sistema primero se ejecuta esta expresión
ya que va de izquierda a derecha.
Si agrego paréntesis, obtengo el resultado correcto
Tengo un punto interesante por hacer:
cuando escribo 1/3 + 2/3, obtengo el SmallInteger 1.
No obtengo 1.000 ... o 0.999 ...
Manipulo fracciones exactas. Obtengo cálculos exactos.
Para resumir,
hay tres tipos de mensajes, que deberías saber por ahora:
Unario, binario, palabras clave.
Primero ejecuta paréntesis,
luego unarios, binarios y palabras clave.
Cuando estan en el mismo nivel,
por ejemplo, con dos mensajes unarios, vas de izquierda a derecha.
No hay precedencia matemática
dado que los operadores matemáticos son simples mensajes,
lo que es diferente de la mayoría de los idiomas.
Los argumentos se colocan dentro del mensaje estructura, por ejemplo en between:and: