Objetos en AjIo (Parte 1)

En estos días, he estado escribiendo un intérprete tipo lenguaje Io, en C#. Se llama AjIo (¿de qué otra forma podría llamarlo? :-). Escribí sobre el tema en mis anteriores posts:

Working in AjIo: Io-like interpreter in C#

AjIo: Intérprete tipo Io en C#

Ahora, quisiera discutir el diseño que adopté para soportar objetos enAjIo. Este intérprete no es un Io verdadero, no es una implementación exacta del lenguaje Io. Es mi proyecto, y mi intención es reescribir Io, parcialmente, para que pueda usar objectos nativos de .NET y acceder a toda su librería de clases. Soy un entusiasta de usar las Virtual Machine existentes (.NET, Java) y sus librarías de clases, para reimplementar sobre ellas lenguajes dinámicos, funcionales o de otro tipo.

La interface IObject es la madre de todos los objetos en AjIo:

Más detalle en el código fuente:

namespace AjIo.Language
{
    public interface IObject
    {
        string TypeName { get; }
        IObject Self { get; }
        IObject Parent { get; }
        object Evaluate(object expression);
        void SetSlot(string name, object value);
        object GetSlot(string name);
        void UpdateSlot(string name, object value);
    }
}

Los métodos de slot son usados para implementar propiedades dinámicas en los objectos AjIo. Un objeto AjIo no tiene predeterminadas propiedades, sino que se pueden agregar (definir con valores) en cualquier momento de la ejecución. El método UpdateSlot necesita que el slot esté previamente definido. Vean que UpdateSlot y SetSlot reciben como valor (segundo parámetro) NO un IObject, sino un object nativo de .NET cualquiera.

La propiedad TypeName es usada para imprimir un objeto. Esto es, evaluando:

Object clone

imprime como

Object_14fd2b5

El prefijo “Object” es el nombre del tipo del nuevo objecto. Notar que Object es un objeto en AjIo, no es el nombre de una clase. Y es el objeto “tope” de toda la jerarquía.

La propiedad Self apunta al objeto en proceso. Puede que no sea el apuntado por la palabra C# this. Tendré que discutirlo cuando llegue, en otro post, al tema de los objetos locales.

El Io original es un lenguaje basado en prototipos. Cada objeto Io tiene un slot Protos, con la lista de prototipos de la que depende. Usando YAGNI, en lo que escribí todavía no necesité una lista de prototipos. Por lo tanto, sólo hay una propiedad Parent que apunta al padre del objeto, si existe. Hay un objeto que no tiene padre, y es el prototipo Object del que derivan todos los otros objetos AjIo.

El método Evaluate usualmente recibe un mensaje (que es un nombre más argumentos), pero, de nuevo, como quiero soportar objetos nativos, envío como parámetro a este método un object de .NET.

El proyecto es “work in progress”, la interface de arriba no está “esculpida en piedra”, y puede que sufra modificaciones en el transcurso del desarrollo. Estoy usando TDD: en el caso que necesite algo nuevo, lo agregaré, y los tests ya escritos me servirán de soporte para ver que todo siga andando. El proyecto va tomando forma, espero que queden pocos cambios pendientes en esta interface. El código fuente lo pueden encontrar en:

http://code.google.com/p/ajcodekatas/

en el directorio AjIo.

Próximos posts para escribir: descripción de las implementaciones iniciales de esta interface.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

This entry was posted in 12677, 13671, 1389, 8870. 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>