**Challenge yourself**
Ejercicios tomados del capitulo homónimo del libro "[Learning Object-Oriented Programming, Design with TDD in Pharo](https://files.pharo.org/books-pdfs/learning-oop/2018-04-01-LearningOOP.pdf)",
For each of the expressions below, fill in the answers: * What is the receiver object? * What is the message selector? * What is/are the argument (s)? * What is the result returned by this expression execution?
# Challenge: Message identification
* receiver: 3 * selector: + * arguments: 4 * result: 7
El selector es el mensaje que queremos que objeto ejecute. En este caso es today. El argumento en este caso es nulo, pues no existe ningún elemento extra o parámetro que le esté dando al mensaje.
* receiver: Date * selector: today * arguments: Nulo. (No existe ningun elemento extra o parametro que este dando al mensaje). * result: 2025-04-09
![ ](https://i.imgur.com/ebyEq45.png)
* receiver: #('' 'World') * selector: "at put: " * arguments: "1" y "Hello" * result: [Hello], [World] Mensaje de tipo keyword, porque podemos distinguir las palabras en todos los mensajes de tipo keyword, porque están sucedidas de los :. En este caso en particular el selector es: at: put:
* receiver: #(1 22 333) * selector: at * arguments: 2 * result:22
* receiver: #(2 33-4 67) * selector: collect: * arguments: [ :each | each abs ] * result: 2 33 4 67
Este es un caso de la combinación de tres cosas: las colecciones, los bloques y los iteraradores. each es el iterador, que toma la forma de las llamadas variables mudas, pues puedo colocar su nombre de manera arbitraria (se define en la parte a la izquiera de la barra del bloque [ :each y a la derecha, lo que quiero hacer con dicha variable, una vez vaya tomando los valores de cada elemento en el arreglo, que, para este ejercicio, es sacar el valor absoluto (each abs ]). Podría haberle llamado number o de otra forma. Lo clave es que el nombres :each sea el mismo usado antes y después de la barra del bloque, que separa la definición de variables, de lo que hago con ellas.
![ ](https://i.imgur.com/IvnX7Yd.png)
* receiver: 25 * selector: @ * arguments: 50 * result:x 25 y 50
![ ](https://i.imgur.com/TYfLWYn.png)
* receiver: Smallinteger * selector: maxval * arguments: No existe * result: 1152921504606846975
El receptor es una clase, pues Empieza en mayúsculas. Se refiere a un conjunto o todo. Estamos encontrando el mayor valor del subconjunto o clase de todos los enteros pequeños.
* receiver: #(a b c d e f) * selector: includesAll: * arguments: #(f d b) * result: true * Mensaje Binario
* Tipo de mensaje: Keyword. * Receptor: #(a b c d e f) * Selector: ìncludesAll:` * Argumento: #(f d b) * Resultado: true * Interpretración: Queremos saber si los elementos del segundo arreglo están en el primero.
* receiver: true * selector: | (ó lógica o conjunción) * arguments: false * result: true * Mensaje Binario
* Tipo mensaje: binario. * Receptor: true * Selector: |(ó lógica o conjunción) * Argumento: false * Resultado: true * Interpretación: Estamos encontrando el resultado del operador lógico "ó", también llamado conjunción. Sirve para distintas operaciones, en particular la búsqueda de información
* receiver: Point * selector: selectors * arguments: Ninguno * result: 120 items * Mensaje Unario
* Tipo de mensaje: Unario. * Receptor: Point (clase) * Selector: selectors * Argumento: ninguno. **Interpetación del resultado: Estamos encontrando todos los mensajes que entiende la clase Point y por tanto todas sus instancias.**
![ ](https://i.imgur.com/RPw6WbV.png)
# Challenge: Literal objects
What kind of object does the following literal expressions refer to? It is the same as asking what is the result of sending the class message to such expressions.What kind of object does the following literal expressions refer to? It is the same as asking what is the result of sending the class message to such expressions.
* Número
* Simbolo
* Arreglo
* Cadena
* Bloque Es un bloque, porque está delimitado por paréntesis cuadrados. En este caso la barra vertica |, no es el operador lógico "ó", sino un separador entre la variables del bloque y las operaraciones del mismo. Para mayor ampliación, ver la sección de bloques en Representando y Procesando datos en Pharo
* Caracter
* Valor de tipo Binario.
Se trata de un valor binario Ojo no es un operador binario. * Mientras que los operadores binarios corresponden a las operaciones de la lógica binaria y son múltiples (and, or, not, xor, implicación). * Los valores binarios corresponde a aquellos que pueden usarse para dichas operaciones y son sólo dos: verdadero o falso (a veces representados como 1 y 0, respectivamente).
**No es un operador Binario. Tener cuidado.**
* Número
# Challenge: Kind of messages
Examine the following messages and report if the message is unary, binary or keyword-based.
* Unary
* Unary
* Receptor: Browser. * Selector: open * Argumento: ninguno.
* keyword-based
* keyword-based
Démonos cuenta que la cantidad de elementos en los argumento no determina el tipo de mensaje. Sino las reglas vistas previamente. Por ejemplo: 3 between: 1 and: 6 Se puede analizar así: * Tipo: keyword. * Receptor: 3. * Selector: between: and: * Argumentos: 2, 6.
* binary
* unary
* keyword-based
# Challenge: Results
Examine the following expressions. What is the value returned by the execution of the following expressions?
* -2
* -2
* 32
* second
* (4 9 100 9) El bloque toma a cada elemento y lo multiplica por sí mismo.
* 5
* -32
* true
# Challenge: unneeded parentheses
Putting more parentheses than necessary is a good way to get started. Such practice however leads to less readable expressions. Rewrite the following expressions using the least number of parentheses.
* x between: (pt1 x) and: (pt2 y)
* #(a b c d e f asSet) intersection: #(f d b asSet)
![ ]( https://i.imgur.com/9KhuRTl.png)
* Se genera error en la x.
* OrderedCollection new add: 56; add: 33; yourself
* 3 + 4 + (2 * 2) + (2 * 3)
* Se escribe tal cual, ya que si quitamos los parentesis el código genera error.
* 'http://www.pharo.org' asUrl retrieveContents