﻿/**
 * 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;
}

class IntValue : Value
{
	BigInt data;
	mixin SimpleConstructor;
	mixin SimpleCompare;
}

class StrValue : Value
{
	string data;
	mixin SimpleConstructor;
	mixin SimpleCompare;
}

class FunValue : Value
{
	Value delegate(immutable LexPosition pos, Value[]) data;
	mixin SimpleConstructor;
	Value call(immutable LexPosition pos, Value[] args) { return data(pos,args); }
}
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;
	}
}
