viernes, noviembre 18, 2005

La magia del Smalltalk: Capítulo 13 – Expression Builder (Un ejemplo de #doesNotUnderstand:)

Ya hemos hablado, en un post anterior, del mensaje #doesNotUnderstand:; ese mensaje "especial", que envía el Smalltalk automáticamente, al objeto receptor, cuando este no tiene un método para responder al mensaje original.

En el un post anterior habíamos hablado de como se puede hacer un Proxy y otros ejemplos, y ahora veremos un ejemplo un poco más complicado, pero también más interesante.

El problema a resolver es el siguiente: Necesitamos crear expresiones válidas en algún lenguaje (por ejemplo SQL) desde sentencias escritas en bloques de Smalltalk.

Supongamos que queremos convertir un bloque tipo:

customers select: [:each | each income > 0]

En una sentencia SQL tipo:

SELECT * FROM Customer WHERE (Customer.income > 0)


NOTA: Vi por primera vez usar este truco en el framework de mapeo relacional-objetos llamado GLORP, de allí que use un ejemplo donde se genera sentencias SQL.



El truco es evaluar el bloque en cuestión con un objeto que sólo entienda el mensaje #doesNotUnderstand:. Esa evaluación “capturará" la información del mensaje y devolverá otro objeto capaz de seguir capturando esa información. El resultado final será una estructura que describa, en un árbol, la secuencia de mensajes (incluyendo receptores y argumentos).

BlockContext>>asExpression
    
"answer the receiver transformed as an EBExpression"

    
^ self value: EBArgumentExpression new



EBExpression>>doesNotUnderstand: aMessage
    
aMessage selector == #doesNotUnderstand:
        
ifTrue: [^ self basicDoesNotUnderstand: aMessage].

    
^ EBMessageExpression
            
receiver: self
            
message: aMessage.



El siguiente test muestra uno de los casos:

EBTest>>testSimplestUnary
    
| expected result |

    
expected := EBMessageExpression
                        
receiver: EBArgumentExpression new
                        
selector: #isNil.

    
result := [:param | param isNil] asExpression.

    
self should: [result equals: expected].



Y, para terminar, vamos a crear un par de métodos llamados #asLispyString en Object (para que todos los objetos puedan convertirse a un string “Lispy") y en la jerarquía de EBExpression:

Object>>asLispyString
    
^ self asString


EBArgumentExpression>>asLispyString
    
^ '[arg]'


EBMessageExpression>>asLispyString
    
| result |
    
result := String new writeStream.
    
    
result nextPutAll:'('.
    
result nextPutAll: self selector asString.

    
result space.
    
result nextPutAll: self receiver asLispyString.
    
    
self arguments do:[:each |
            
result space.
            
result nextPutAll: each asLispyString.
        ].
    
    
result nextPutAll:')'.
    
    
^ result contents.


De esa manera podemos escribir algunos tests como estos:

EBTest>>testLispyString1
    
| result |
    
    
result := [:param | param isNil] asExpression.
    
    
self should: [result asLispyString = '(isNil [arg])'].


EBTest>>testLispyString2

    
| block1 block2 result |

    
block1 := [:each | each > 1].
    
block2 := [:each | each < 10].

    
result := [:each | (block1 value: each) & (block2 value: each)] asExpression.

    
self should: [result asLispyString = '(& (> [arg] 1) (< [arg] 10))'].





Espero les guste el ejemplo.

Pueden bajar un changeset con el ejemplo completo: ExpressionBuilder-dgd.4.cs.gz

miércoles, noviembre 16, 2005

PDF de la Nota en Mundo Linux de Noviembre


Pueden descargar el PDF de la nota sobre Squeak que salió publicada en la revista Mundo Linux de Noviembre.

viernes, noviembre 11, 2005

Pequeña aplicación de ejemplo con Squeak y Seaside


Tuve que hacer, unas semanas atrás, una pequeña aplicación web de ejemplo usando Squeak y Seaside.

El Seaside es un framework para hacer aplicaciones web con Squeak basado en continuations. Pueden leer más detalles sobre el framework en http://www.seaside.st/.

La aplicación que hice es muy simple, pero tiene desarrollado todo el modelo usando UnitTests y TDD (Test Driven Design).

Pueden bajar la imagen de Squeak, con el seaside y la aplicación funcionando, desde: http://www.consultar.com/trastero/appointments.tar.gz

Una vez que ejecuten el Squeak con esa imagen, apunten su navegador a la dirección: http://localhost:9090/seaside/appointments

Entren con usuario dgd y contraseña vacía.

Espero les guste.

martes, noviembre 08, 2005

Algo de historia de Smalltalk y Squeak

El proyecto Smalltalk tuvo un fuerte período de desarrollo durante toda la década de 1970 en los laboratorios PARC de Xerox.

Se puede leer un poco de la historia de Smalltalk en http://en.wikipedia.org/wiki/Smalltalk, pero la mejor referencia histórica es el paper publicado por Alan Kay, en el año 1993 (antes del proyecto Squeak), llamado The Early History of Smalltalk.


Terminando la década, el grupo decide mostrar sus avances al mundo y decide publicar algunos (ya míticos) libros como "Smalltalk-80: Bits of History, Words of Advice", "Smalltalk-80: The Interactive Programming Environment" y "Smalltalk-80: The Language and Its Implementation".


Los 2 primeros (el "green" y el "orange") se pueden descargar desde la página de libros gratuitos de Smalltalk de Stéphane Ducasse. El "blue" perdió los capítulos sobre la implementación (que de cualquier forma se pueden ver en la web), se transformó en el "purple" y todavía se puede comprar en Amazon.


También durante ese período se publicó un número de la revista Byte, el de agosto de 1981, completamente dedicado al Smalltalk.



De esa revista podemos leer, en Internet, "Design Principles Behind Smalltalk" de Dan Ingalls (y su traducción al Castellano). Esta nota es una verdadera joyita donde, uno de los responsables de Smalltalk, nos cuenta su visión de cómo se deberían usar las computadoras y los porqué.

Me quedo con sólo una frase del artículo:

Operating System: An operating system is a collection of things that don't fit into a language. There shouldn't be one.
Sistema Operativo: Un sistema operativo es una colección de cosas que no encajan dentro de un lenguaje. No debería existir.

Y, para terminar y que les de un poco de envidia, les comento que yo soy un feliz dueño de cada uno de los libros y revista que les comenté en esta nota.

lunes, noviembre 07, 2005

Otro libro de Squeak

Acabo de recibir una copia del nuevo libro de Squeak escrito por mi amigo Stéphane Ducasse. Recibí una copia de regalo porque fui uno de los revisores del libro.

El libro pretende ser un curso de programación que utiliza un entorno similar al Logo dentro de Squeak.

El prólogo está escrito por Alan Kay y, como siempre, nos incita a utilizar Smalltalk como una herramienta para convertir al mismo Smalltalk en algo obsoleto. Nos recuerda que Smalltalk debe ser un medio y no un fin.