Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

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

Estoy trabajando en implementar un interéprete C# llamado ABLOCKED SCRIPT 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

Published Mon, Sep 19 2011 11:07 by lopez

Comments

# re: Aj Script: Intérprete tipo Javascript en C# (1) Interfaces de Base@ Monday, September 19, 2011 9:06 AM

Para el título podés usar el caracter unicode "U+200B ZERO WIDTH SPACE", o sea que te queda la palabra unida y el server no te la va a rechazar: "Aj​Script"

alecu

# Aj​Script: Intérprete tipo Javascript en C# (2) Expresiones@ Monday, September 26, 2011 4:29 AM

Anterior Post Como en otros intérpretes, una pieza clave es la Expression, algo para evaluar durante

Angel "Java" Lopez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: