miércoles, julio 20, 2005

La magia del Smalltalk: Capítulo 0

Voy a probar suerte con una serie de artículo que cuenten las cosas que me sorprendieron de Smalltalk cuando empecé a aprenderlo. Esto NO pretende ser un curso de Smalltalk ni mucho menos, sólo pretendo divertirme un poco mostrando las cosas "raras", "locas" o "esotéricas" del Smalltalk.

Esta serie de artículos podría bien llamarse: "Pruebe esto en su lenguaje de preferencia".

Como este es el capítulo 0, no esperen gran cosa... es sólo el "concept" ;-)


Al ruedo:

Objeto/Mensaje:

Lo primero, y más importante, es que en Smalltalk todo es un objeto y toda la computación se hace enviando mensajes a los objetos. Cuando digo "todo" no me refiero a ese "todo, pero..." al que estamos acostumbrados los programadores.

Para dejarme de tanto rollo, voy a dar ejemplos concretos de cosas que son Objeto/Mensaje en Smalltalk y que no suelen serlo en los lenguajes llamados "Orientados a Objetos". Las clases, el true, el false, el nil, el compilador, los métodos, el debuger, los contextos de activación de los métodos, los números, los arrays, etc.



El comportamiento (aka el "código") es un Objeto.

Como decía antes, todo es un objeto. Por ejemplo: el comportamiento (mal llamado "código") también es un objeto. Tenemos 2 tipos de comportamiento: Los métodos y los bloques. Los métodos son objetos que la clases tienen (claro, también las clases son objetos). Los bloques son comportamiento creados con un literal que el compilador conoce: los corchetes. Sentencias Smalltalk encerradas entre corchetes se convierten en un objeto de clase BlockContext. ¿Para que sirve eso?, sirve para lo que sirven todos los objetos: para enviarles mensajes. A los objetos Bloque se les puede enviar el mensaje #value que lo activará ejecutando el comportamiento que contenga.



¿Estructuras de control? - No, gracias.

1 > 3 ifTrue: [ Transcript show: 'Verdadero, che!!!!' ]

Pues sí, adivinaste... las llamadas "estructuras de control" de los lenguajes tradicionales, que suelen ocupar apartados especiales en los libros, no son más que mensajes en Smalltalk. Se puede aprender mucho viendo la implementación en las clases Boolean, True y False de los métodos #ifTrue:, #ifFalse:, #ifTrue:ifFalse:, #ifFalse:ifTrue:, etc.


[ unStream atEnd ] whileFalse: [ Transcript show: unStream next asString; cr ]

Para ver un poco estos mensajes, ver la implementación de #whileTrue, #whileFalse, #whileTrue:, #whileFalse:, etc en la clase BlockContext (la clase de los bloques de código).



¿Bucles? - No, gracias.

Una de las razones principales para usar bucles en los lenguajes tradicionales es para procesar colecciones. Distintos lenguajes usan diferentes idioms para iterar colecciones... tenemos desde cosas muy básicas como un FOR desde 1 al tamaño del Array hasta cosas un poco menos primitivas como los Iteradores de Java o de la STL de C++.

¿Cómo se procesa una colección en Smalltalk? Pues sí, adivinaste de nuevo... con un mensaje. En este caso el mensaje es #do:.

unaColeccion do: [:each | Transcript show: each asString; cr ]

La colección recibe el mensaje #do: con un bloque como parámetro y es responsable de evaluar dicho bloque por cada elemento que contenga. Lo más importante en este ejemplo es que nosotros no tenemos ni la más mínima idea de que tipo de colección es unaColeccion, pero no lo necesitamos saber ya que ella sabrá cual es la mejor forma de iterarse a si misma.

El idiom de #do: no termina con las colecciones, sino que cualquier cosa que se pueda recorrer lo podremos hacer con #do:. Por ejemplo: Los Streams, de esa forma reescribimos el ejemplo anterior de unStream:

unStream do: [:each | Transcript show: each asString; cr ]

Como verán, para iterar una colección o un stream usamos el mismo mensaje... es decir que podemos intercambiar, en cualquier momento, una colección por un stream... o una colección por otro tipo de colección... o una colección por cualquier objeto que sepa responder a #do:.


FINAL DEL CAPÍTULO 0.


Les prometo que los próximos artículos serán más entretenidos.

3 Comentarios:

At 20/7/05 14:33, Anonymous Cek said...

Interesante, por lo que veo se parece mucho al lenguaje funcional LISP, pero en vez de ser listas son objetos.

 
At 20/7/05 14:40, Blogger Diego Gomez Deck said...

Lo escuché decir a Alan Kay, varias veces, que todo buen programador debería saber al menos: Smalltalk, LISP y Prolog.

Los 3 lenguajes comparten parte de "magia".

 
At 21/7/05 10:16, Anonymous jredrejo said...

Más, quiero más...

 

Publicar un comentario

<< Principal