Aj Script: Intérprete tipo Javascript en C# (1) Interfaces de Base

Published on Author lopez2 Comments

Estoy trabajando en implementar un interéprete C# llamado AjScript: un lenguaje tipo Javascript. El código (en progreso) está siendo publicado en:

https://github.com/ajlopez/AjScript

(el título de este post es Aj Script con un blanco, el Community Server me rechaza el título conteniendo AjScript al tomarlo por un script y lo bloquea).

Comenzó hace unos meses dentro de mi AjCodeKatas project en Google Code, pero hace unas semanas lo moví a GitHab: me permite tener más proyectos. En cambio, Google Code tiene un límite por número de proyectos. Por eso he puesto muchos pequeños proyectos dentro de AjCodeKata. Ahora, con GitHub no tengo esa limitación (hay límites de espacio no de cantidad de proyectos). Y con los forks públicos y los pull request, GitHub tiene su encanto.

La idea es tener un intéprete que tenga las “good parts” de Javascript. Estoy discutiendo conmigo mismo cuáles serán, por ejemplo, cómo estabilizar el tema de la herencia. Pero un punto clave a soportar es: acceso a objetos .NET nativos. Pueden escribir

var obj = new System.IO.DirectoryInfo(‘.’);

directamente en AjScript. Y pueden invocar código AjScript desde una aplicación .NET.

Pero ahora, quiero presentar las interfaces de base de este intérprete. Primero, IObject, la interfaz que todo objeto AjScript debe implementar:

 

public interface IObject
{
    IFunction Function { get; }
    object GetValue(string name);
    void SetValue(string name, object value);
    ICollection<string> GetNames();
    object Invoke(string name, object[] parameters);
    object Invoke(ICallable method, object[] parameters);
}

Vean que cada objeto tiene una propiedad Function: es la “clase” del objeto, la función usada al crearlo. Puede que lo cambie por Prototype.

Para mantener los nombres de las variables y sus valores, tengo una interfaz IContext:

public interface IContext
{
    IContext RootContext { get; }
    ReturnValue ReturnValue { get; set;  }
    void SetValue(string name, object value);
    object GetValue(string name);
    void DefineVariable(string name);
}

Noten que un contexto puede tener un contexto padre, para de esta forma tener contextos anidados. La propiedad ReturnValue es usada para detectar si hay un comando return ejecutado varios niveles adendro en la ejecución actual.

Cualquier método AjScript implementa ICallable:

public interface ICallable
{
    int Arity { get; }
    IContext Context { get; }
    object Invoke(IContext context, object @this, object[] arguments);
}

Noten que las funciones son IObject y ICallable con el poder adicional de poder crear un nuevo objeto:

public interface IFunction : ICallable, IObject
{
    object NewInstance(object[] parameters);
}

Próximos posts: ejemplos, closures, manejo de objetos nativos, lexer y parser, tests con TDD (escribí este intérprete usando TDD, tiene >80% de code coverage, podría mejorarlo).

Trabajo pendiente: implementar Function como “clase” con argumentos, prototype con propiedad .constructor, typeof, y las “clases” Javascript originales como Number, Date y otras; decidir qué características de  Javascript quedan “dentro” y cuáles quedan “fuera”. ¿Sugerencias?

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Leave a Reply

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