ObOps: Operadores para Objetos

En varios de mis proyectos open source de intérpretes, uso una librería Microsoft.VisualBasic que tiene un namespace Microsoft.VisualBasic.CompilerServices con una clase Operators que implementa operaciones sobre objetos cualesquiera. Por ejemplo, puede sumar dos objetos, sin saber de antemano qué tipo tienen (enteros, dobles, strings) cada uno de los dos parámetros. La comencé a usar ya debe ser casi una década, y fue una de las razones para escribir AjGenesis directamente en Visual Basic.NET: me permite escribir

obj1 + obj2

sin saber los tipos de antemano. Como AjGenesis compilado en Windows, corre tal cual en Mono, me confié que los métodos de esa clase Operators estaban disponibles en otras plataformas. Así que escribí varios intérpretes usando esa clase.

Pero ahora que estoy escribiendo Mass, el bueno de @MartinSalias me cuenta por un mensaje de Twitter, que no hay Microsoft.VisualBasic.CompilerServices.Operators en Mono.

Leo en:

http://www.mono-project.com/FAQ:_Technical

With regards to languages, C# applications tend to be most portable. Visual Basic .NET applications are portable, but Mono’s Microsoft.VisualBasic.dll implementation is incomplete. It is recommended to either avoid using this assembly in your own code, only use the portions that Mono has implemented, or to help implement the missing features. Additionally, you can set ‘Option Strict On’, which eliminates the implicit calls to the unimplemented Microsoft.VisualBasic.CompilerServices.ObjectType class. (Thanks to Jörg Rosenkranz.)

Así que no puede compilar la solución. En estos meses, estoy ocupado preparando tres charlas (dos ya las dí: Node.js, Ruby; ahora dentro de poco, viene la tercera, Python) con sus respectivos ejemplos y presentaciones. Pero igual pude hacerme un tiempo para comenzar a implementar algo en C# para subsanar la falencia:

https://github.com/ajlopez/Obops

Traté de implementar algún tipo de “double dispatch” o algo parecido, usando generics y demás, pero parece que no hay tu tía. Mi investigación en:

https://github.com/ajlopez/Obops#references

Así que comencé a implementar los operadores aritméticos binarios, uno a uno:

https://github.com/ajlopez/Obops/blob/master/Src/Obops/Operators.cs

Pero no crea que todo lo hice yo. Como vi que había una explosión de combinaciones, decidí pasar, luego de tener algunos casos implementados, a la generación automática de código. Pueden ver el modelo, las plantillas y tareas en:

https://github.com/ajlopez/Obops/tree/master/CodeGen

Tengo que explicar ahí más en detalle como lo consigo, pero es, teniendo AjGenesis bin en el PATH, cosa de hacer:

AjGenesis.Console Model.xml Operators.tpl Operators.cs Tests.tpl Tests.cs

Así de simple. Ya lo comencé a usar en Mass:

https://github.com/ajlopez/Mass

Pero falta:

- Implementar más operadores

- Habilitar la configuración por código desde afuera (por ejemplo, para sumar null + entero, usar tal función)

- Agregar tests que prueben el resultado contra la implementación original de Microsoft.VisualBasic

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 15035, 17834, 17960, 5374, 6145. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>