Artifact 2eb228662dba6e2da3fc4fc62e55c4a1e62075ba
/**
* Authors: k.inaba
* License: NYSL 0.9982 http://www.kmonos.net/nysl/
*
* Runtime data structures for Polemy programming language.
*/
module polemy.runtime;
import polemy._common;
import polemy.lex : LexPosition;
import std.stdio;
class PolemyRuntimeException : Exception
{
this(string msg) { super(msg); }
}
abstract class Value
{
}
class UndefinedValue : Value
{
mixin SimpleConstructor;
mixin SimpleCompare;
override string toString() const { return "(undefined)"; }
}
class IntValue : Value
{
BigInt data;
mixin SimpleConstructor;
mixin SimpleCompare;
override string toString() const {
const(char)[] cs; data.toString((const(char)[] s){cs=s;}, null);
return to!string(cs);
}
}
class StrValue : Value
{
string data;
mixin SimpleConstructor;
mixin SimpleCompare;
override string toString() const { return data; }
}
class FunValue : Value
{
Value delegate(immutable LexPosition pos, Value[]) data;
mixin SimpleConstructor;
Value call(immutable LexPosition pos, Value[] args) { return data(pos,args); }
override string toString() const { return sprintf!"(function:%s:%s)"(data.ptr,data.funcptr); }
}
import std.stdio;
class Context
{
Context parent;
Value[string] table;
this(Context parent = null) { this.parent = parent; }
void add(string i, Value v)
{
table[i] = v;
}
Value opIndex(string i)
{
if( i in table )
return table[i];
if( parent is null )
throw new PolemyRuntimeException(sprintf!"variable %s not found"(i));
return parent[i];
}
void opIndexAssign(Value v, string i)
{
if( i in table )
return table[i] = v;
if( parent is null )
throw new PolemyRuntimeException(sprintf!"variable %s not found"(i));
return parent[i] = v;
}
}