Artifact c94ffd373336811756c3540fd18fc34994fd8eed
/**
* 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;
class PolemyRuntimeException : Exception
{
this(string msg) { super(msg); }
}
abstract class Value
{
}
class IntValue : Value
{
BigInt data;
mixin SimpleConstructor;
mixin SimpleCompare;
}
class StrValue : Value
{
string data;
mixin SimpleConstructor;
mixin SimpleCompare;
}
abstract class FunValue : Value
{
Value call(Value[] args);
}
class PrimitiveFunction : FunValue
{
Value delegate(Value[]) data;
mixin SimpleConstructor;
override Value call(Value[] args) { return data(args); }
}
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;
}
}