En esta sesión, le presentaré los bloques.
Son una especie de métodos anónimos. También se llaman cierres léxicos.
Están en todas partes en Pharo.
Son la base de los ciclos, condicionales, iteradores,
e incluso GUI o lenguajes dedicados.
Están en el corazón del sistema.
Han sido introducidos sólo en la última versión de Java.
Para definir un bloque, use corchetes.
Este es un ejemplo:
[expresiones ...]
Hablaremos sobre la definición de bloques.
Otro ejemplo:
esta expresión, 1/0,
Devuelve un error cuando se ejecuta.
Vamos a encapsularla en un bloque
definiendo un bloque que contiene la expresión 1/0.
Si evalúo la definición de este bloque, no pasa nada; no hay error
Devuelve el bloque
debido a que una definición de bloque no ejecuta su cuerpo.
Puede definir tantos bloques como desée:
las expresiones en su cuerpo están congeladas.
Para evaluar un bloque y las expresiones en su cuerpo,
debe hacerlo explícitamente a través del mensaje value:
Por ejemplo, este es un bloque: [2 + 6]
Le envía el mensaje value:
Las expresiones en el cuerpo son evaluados
Devuelve el resultado, 8.
Sin embargo, si el bloque contiene expresiones erróneas,
se devuelve el error cuando se evalúa el bloque,
como en el ejemplo 2.
[1/0] envío el mensaje value al bloque
Devuelve un error.
Los bloques también pueden tener argumentos.
como en este argumento. Es como los métodos.
Un bloque siempre se abre con [
y cerrado con ].
Todos los argumentos tienen por prefijo los dos puntos
Luego hay |, una barra vertical
que separa la declaración de argumentos del cuerpo del bloque,
la expresion que contiene
el argumento en este ejemplo es x.
x + 2 es la única expresión en el bloque
Si envío el mensaje value al bloque,
tiene que usar un mensaje específico, value: con un parámetro.
Al mismo tiempo, pasa value: 5 que reemplaza el argumento x
cuando las expresiones del bloque son evaluados
Si envío el mensaje value: 5 a este bloque,
devuelve 7
ya que el valor de x es 5 cuando se evalúa el bloque.
Esto es como mi ejemplo anterior,
pero con varias expresiones en el bloque
Tengo dos aquí:x + 33 y x + 2.
Cuando envío value: 5
para evaluar las expresiones en el bloque,
la evaluación regresa
solo el valor de la última expresión en el bloque
Solo devuelve el resultado de x + 2,
7.
Los bloques son objetos normales en Pharo.
Pueden ser almacenados en variables temporales.
Se pueden enviar mensajes como los objetos normales
Este es el ejemplo que tengo para usted aquí.
Puede almacenar la definición de este bloque, x + 2,
en una variable llamada add2.
Luego envias mensajes para evaluar el bloque varias veces.
Envío el mensaje value: una vez
diciéndole que se evalúe a sí mismo con value: 5 regresa 7.
Luego el mensaje value: 33.
Regresa 35
También puede definir bloques con varios argumentos
Por ejemplo, x e y. Este bloque tiene dos argumentos.
¿Pero cómo evaluarías este bloque?
Ya que necesita pasar dos valores para activar su evaluación,
5 y 7 que reemplazan a x e y?
La respuesta es que usa el mensaje value: vale:,
un método del la clase bloque.
5 reemplaza x y 7 reemplaza y.
Regresa 12
Como los métodos, los bloques también puede definir variables temporales.
Este ejemplo es un ejemplo real:
proviene de la colección de clases.
El bloque comienza aquí. Termina ahí
Se necesita un argumento llamado :index.
Se necesita una variable temporal definida aquí entre dos |.
Se llama args.
Esta variable temporal args
existe solo durante la evaluación de las expresiones en el bloque.
Los bloques se definen en los métodos.
En un bloque, también puede usar un retorno.
Esto es un ejemplo de la clase entero.
El método se llama factorial.
Hay varios bloques en el método.
Estos bloques contienen retornos, o ^.
El retorno ayuda para salir del método factorial.
Por ejemplo, si envío el mensaje factorial al entero 0,
Devuelve la respuesta 1.
Obtengo esta respuesta gracias a este ^, el primero en el bloque,
lo que ayuda para salir del método factorial.
Un retorno en un bloque ayuda a salir del método
que define el bloque.
Un pequeño consejo para cuando use bloques:
Los bloques son elementos extremadamente potentes.
Debe usarlos con cuidado.
No vayas más allá de dos o tres argumentos. para un bloque
Si tiene más, se vuelve incomprensible
Es mejor definir una clase con variables y métodos de instancia:
será mucho más legible.
En el curso, estudiamos bloques, su sintaxis,
el hecho de que son una especie de métodos anónimos,
esto es, cierres léxicos;
pueden almacenarse en variables ya que son como cualquier otro objeto.
En otras lecciones, veremos que los bloques son la base de muchas construcciones
como ciclos, iteraciones, etc.